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