如何准确地将nvarchar转换为varbinary

use*_*070 1 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]))
Run Code Online (Sandbox Code Playgroud)

现在在[temp]列中,值不同.例如,一个[password]以此开头的值:

0x3E6AFF88...
Run Code Online (Sandbox Code Playgroud)

[temp]中的相应条目以:

0x30783345...
Run Code Online (Sandbox Code Playgroud)

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

Aar*_*and 9

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

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

请注意,转换为NVARCHAR(MAX)to NVARCHAR(MAX)是不必要的.

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

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

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