非常简单的场景:
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 '%%'
无效。
答案 0 :(得分:1)
HASHBYTES返回varbinary (maximum 8000 bytes)
。并且您使用引号'0x900150983CD24FB0D6963F7D28E17F72'
使其成为varchar
。从varchar
到varbinary
的转换是明确的(请参阅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