簡體   English   中英

如何准確地將 nvarchar 轉換為 varbinary

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM