【问题标题】:SQL Hash condition returns NULLSQL 哈希条件返回 NULL
【发布时间】:2017-10-30 12:02:58
【问题描述】:

非常简单的场景:

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'

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

附: Hash LIKE '%%' 没有帮助。

【问题讨论】:

  • hashbytes 返回一个varbinary,它最终出现在表格中。您正在将其与 varchar 进行比较。
  • [Hash] = 0x900150983CD24FB0D6963F7D28E17F72
  • varbinary 文字不包含在引号中。

标签: sql sql-server tsql hash


【解决方案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'

这是对前面查询中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

希望,这会有所帮助。

【讨论】:

    【解决方案2】:

    脱胎换骨

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

    【讨论】:

    • 你想对第二个查询做什么?
    • 没什么,结果一样
    • 它也将匹配 0x900170983CF26FB0F6963F7D28E17F72 在不区分大小写的排序规则中,因为您正在获取字符串比较语义和 0x70 = 0x50 在这种情况下(Pp
    • 另外,括号不是正确的命名法,它们被称为引号。
    • 感谢 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    相关资源
    最近更新 更多