繁体   English   中英

如何准确地将 nvarchar 转换为 varbinary

[英]How to convert nvarchar to varbinary accurately

我有一个表,其中列[password]存储为nvarchar(max) 我想将其转换为varbinary(max)

我创建了一个名为[temp]的新列,并将其声明为varbinary(max) 然后我使用CONVERT更新:

update tempuser set [temp]=CONVERT(varbinary(max), CONVERT(nvarchar(max),[password]))

现在 [temp] 列中的值不同。 例如, [password]一个值是这样开头的:

0x3E6AFF88...

[temp] 中的相应条目以以下内容开头:

0x30783345...

此外,当[password]NULL[temp]变为0x4E554C4C

您正在转换一个碰巧看起来像二进制值的字符串,因为它以0x 不幸的是,这些不是一回事,为了让 SQL Server 理解您希望将字符串解释为实际的二进制值以直接转换,而不是将字符串转换为其二进制表示,您需要使用样式参数:

UPDATE dbo.tempuser -- please always use the schema prefix
  SET [temp] = CONVERT(VARBINARY(MAX), [password], 1); -- and semi-colons

请注意,转换一个NVARCHAR(MAX)NVARCHAR(MAX)是不必要的。

现在,有可能因为您出于某种原因选择了NVARCHAR(MAX) ,该列包含无法转换的垃圾,因此您可能会遇到此错误:

消息 8114,级别 16,状态 5
将数据类型 nvarchar 转换为 varbinary 时出错。

在这种情况下,您需要找到不以0x (或以其他方式包含不合格字符)的值并修复它们。

尽管看起来像,但您的密码字段似乎实际上并不是 varbinary。

运行这些示例:

SELECT CAST('0x3E6AFF88BEB29D9B234B9E5A5AD329D8D3F33200EC4EE02749C56AD58D040976' AS varbinary(max))
SELECT CAST(CAST('0x3E6AFF88BEB29D9B234B9E5A5AD329D8D3F33200EC4EE02749C56AD58D040976' AS varbinary(max))AS VARCHAR(MAX))

SELECT CAST('dog' AS VARBINARY(MAX))
SELECT CAST(CAST('dog' AS VARBINARY(max))AS VARCHAR(MAX))

您会看到您的结果与您的初始字符串等效,只是采用 varbinary 格式。

正如Hart Co 的回答所示,使用以下代码将密码转换为十六进制数字。

UPDATE dbo.tempuser SET [temp] = CONVERT(VARBINARY(MAX), [password], 1);

如果你有

消息 8114,级别 16,状态 5
将数据类型 nvarchar 转换为 varbinary 时出错。

这意味着您的一个或多个密码包含一个有效的十六进制字符串。 容易忽略的原因之一是您有奇数个字符。 您可以使用以下代码检查导致错误的行:

SELECT id, TRY_CONVERT(VARBINARY(MAX), [password], 1) AS try_convert
FROM tempuser
WHERE try_convert IS NULL

如果发现某些内容无法转换, TRY_CONVERT不会返回错误, 而是返回 NULL。

如果行包含奇数个字符,则可以使用RIGHT函数向左填充零以使其有效。

CONVERT(
    varbinary(MAX),
    RIGHT('000000000000'+SUBSTRING([password], 3, LEN([reg_address])), 16),
    2
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM