我有一个表[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
。
答案 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
)