【问题标题】:Update inserts different hash values than a select does更新插入与选择不同的哈希值
【发布时间】:2017-04-24 13:05:09
【问题描述】:

我正在尝试使用另一列的哈希更新我的 SQL Server user 表中的新列。

当我使用 select 语句测试转换时,它将返回我从在线哈希生成器获得的正确 MD5 哈希。

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

当我在如下所示的更新语句中使用相同的转换时,我得到一个不同的值,然后插入具有相同哈希值的 select 语句。

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

我做错了什么?

【问题讨论】:

  • 你的专栏column1是什么类型的?
  • 您的数据也可能包含空格或不可打印的字符,这会改变哈希值
  • 原来这是 column1 是 nvarchar 的问题。但是我似乎不能使用 nvarchar 是哈希。完成这项工作的唯一方法是在不是 nvarchar 的列上使用它,这意味着我不能允许双字节字符。

标签: sql-server hash md5


【解决方案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 在 cmets 中所提到的,很可能您的数据库中的值中有一些空格或不可打印的字符,当您干运行散列时您不包括在内,因此会产生不同的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-17
    • 2010-09-17
    • 2015-12-01
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多