[英]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.