如何准确地将nvarchar转换为varbinary

时间:2013-07-09 17:54:39

标签: sql database sql-server-2008

我有一个表[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

3 个答案:

答案 0 :(得分:9)

您正在转换一个看起来像二进制值的字符串,因为它以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),可能是因为该列包含无法转换的垃圾,因此您可能会遇到此错误:

  

Msg 8114,Level 16,State 5   将数据类型nvarchar转换为varbinary时出错。

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

答案 1 :(得分:0)

看起来您的密码字段实际上并不是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格式。

答案 2 :(得分:0)

就像 Hart Co's answer shown 一样,使用以下代码将密码转换为十六进制数字。

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
)