SQL哈希条件返回NULL

时间:2017-10-30 12:02:58

标签: sql sql-server tsql hash

非常简单的场景:

SELECT 'abc' as [field1]
        ,HASHBYTES('MD5','abc') AS [Hash]
INTO #test

创建表格。 我跑这个:

SELECT * FROM #test

按预期返回1条记录。

SELECT * FROM #test 
WHERE [field1] = 'abc'

这会返回1条记录。我从[Hash]字段复制值并再次查询:

SELECT * FROM #test 
WHERE [Hash] = '0x900150983CD24FB0D6963F7D28E17F72'

这不会返回任何记录。为什么?哈希字段是以任何特殊方式保存/处理的吗?我预计它将是任何其他文本,我可以查询。有没有解决方法?

P.S。 Hash LIKE '%%'无效。

2 个答案:

答案 0 :(得分:1)

HASHBYTES返回varbinary (maximum 8000 bytes)。并且您使用引号'0x900150983CD24FB0D6963F7D28E17F72'使其成为varchar。从varcharvarbinary的转换是明确的(请参阅here隐式转化部分)。所以你需要使用:

SELECT * 
FROM #test 
WHERE [Hash] = 0x900150983CD24FB0D6963F7D28E17F72

或者:

SELECT * 
FROM #test 
WHERE CONVERT(varchar(max),[Hash],1) = '0x900150983CD24FB0D6963F7D28E17F72'

这是explonation以前查询中的Style = 1

DECLARE @varbin varbinary(max)

SELECT @varbin = CONVERT(varbinary(max),'Something')

SELECT  CONVERT(varchar(max), @varbin, 0) AS [Style 0, binary to character],
        CONVERT(varchar(max), @varbin, 1) AS [Style 1, binary to character],
        CONVERT(varchar(max), @varbin, 2) AS [Style 2, binary to character]

将返回:

Style 0, binary to character    Style 1, binary to character    Style 2, binary to character
Something                       0x536F6D657468696E67            536F6D657468696E67

希望,这有帮助。

答案 1 :(得分:-2)

脱掉Parentehsis

select * from #test where [Hash] = 0x900150983CD24FB0D6963F7D28E17F72
select * from #test where  cast([Hash] as varchar(max)) = 0x900150983CD24FB0D6963F7D28E17F72