3

我有一个表,其中的列[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

4

3 回答 3

11

您正在转换一个恰好看起来像二进制值的字符串,因为它以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(或包含不合格字符)开头的值并修复它们。

于 2013-07-09T18:26:42.173 回答
1

尽管看起来像一个,但您的密码字段似乎实际上并不是一个 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 格式。

于 2013-07-09T18:08:40.840 回答
0

正如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
)
于 2021-02-17T05:32:52.373 回答