2016-12-09 72 views
2

我想用另一列的哈希更新我的SQL Server user表中的新列。更新插入不同的哈希值比選擇不

當我使用select語句測試轉換時,它將返回從在線哈希生成器獲得的正確MD5哈希值。

select CONVERT(VARCHAR(32), HashBytes('MD5', 'valuetohash'), 2) 

當我使用在更新語句此相同的轉換如下所示我得到不同的值,則插入有散列相同值的選擇語句。

UPDATE users SET [newcolumn1] = CONVERT(VARCHAR(32), HashBytes('MD5', column1), 2) 

我做錯了什麼?

+0

什麼類型是你的列'column1'? – ughai

+1

你的數據也可能包含空格或不可打印的字符,這將改變散列值 – ughai

+0

原來這是column1是nvarchar的問題。但我似乎無法使用nvarchar是散列。使這項工作的唯一方法是在不是nvarchar的列上使用它,這意味着我不能允許雙字節字符。 – rocketdoctor

回答

1

您在users.column1中的值與您手動通過HashBytes作爲測試的值不完全匹配。爲了證實這工作時的值相同,請嘗試:

DECLARE @users TABLE (
    column1 VARCHAR(100), 
    newcolumn1 VARCHAR(32) 
) 

INSERT INTO @users 
SELECT 'some text', NULL 

SELECT CONVERT(VARCHAR(32), HashBytes('MD5', 'some text'), 2) 
UPDATE @users SET newcolumn1 = CONVERT(VARCHAR(32), HashBytes('MD5', column1), 2) 
SELECT newcolumn1 FROM @users 

您將看到您從每個SELECT得到的結果都是一樣的,因爲'some text'@users.column1值相同。

首先嚐試比較你的價值觀:

SELECT CASE WHEN column1 = 'expectedValue' 
      THEN 'MATCH' 
      ELSE 'DIFFERENCE' 
     END AS MatchCheck 
FROM users 

SELECT column1 
FROM users 
WHERE column1 = 'expectedValue' 

如果你從第一次查詢結果,其中從第二查詢MatchCheck = 'MATCH'或結果的話,那麼你也應該從你的UPDATE得到你想要的散列結果,因爲這些值是相同的。

正如意見中提到的ughai,它最有可能你有你的數據庫中的一些空格或非打印字符中的值,你不包括當你幹運行散列,因此不同的結果。