2016-12-09 20 views
2

SQL Server userテーブルの新しい列を別の列のハッシュで更新しようとしています。更新はselectと異なるハッシュ値を挿入します

select文で変換をテストすると、オンラインのハッシュジェネレータから取得した正しいMD5ハッシュが返されます。

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

以下のようにIはUPDATEステートメントで、この同じ変換を使用する場合、私はハッシュ同じ値で、次にSELECT文を挿入された異なる値を取得します。

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をテストとして渡した値と正確に一致しません。値が同じである場合、これが動作することを確認するには、試してみてください。'some text'@users.column1の値が同一であるため、

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から取得した結果が同じであることがわかります。

最初にあなたの値を比較してみてください。

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

または

SELECT column1 
FROM users 
WHERE column1 = 'expectedValue' 

あなたがすべてで2番目のクエリからMatchCheck = 'MATCH'や結果最初のクエリから結果を取得した場合、その後、あなたもすべき値が同じであるため、あなたが期待するハッシュを与えるUPDATEから結果を得てください。

コメントにはughaiで述べたように、データベース内の値にスペースや印刷不可能な文字が含まれている可能性があります。この文字は、ハッシュを実行したときには含まれていません。

関連する問題