如何查询存储SHA2_256哈希数据的表中Binary(32)类型列
BINARY(32)类型哈希列查询解决方案
错误原因
你使用的两种写法都不能正确把十六进制字符串转换为对应二进制值:
try1中带单引号的0xXXXX会被识别为普通字符串,隐式转为二进制时是将每个字符的ASCII编码逐位转换,并非按十六进制值解析,和存储的哈希值完全不匹配try2中CAST函数没有十六进制解析逻辑,带引号的字符串转BINARY的逻辑和上述隐式转换一致,同样无法得到正确的二进制哈希值
正确写法
写法1:直接使用十六进制常量
不需要给0x开头的十六进制值加单引号,SQL Server会直接识别为二进制值:
-- 注意替换为你的实际完整哈希值,此处为SHA2_256('test')的真实返回值 SELECT * FROM #TEST WHERE COL_HASHED = 0x9F86D081884C7D659A2FEAA0C55AD015A3BF4F1B2B0B822CD15D6C15B0F00A08
写法2:用CONVERT函数解析字符串格式的哈希值
如果哈希值存储为字符串变量/字段,使用带样式参数的CONVERT函数实现十六进制解析:
- 字符串带
0x前缀,使用样式参数1
SELECT * FROM #TEST WHERE COL_HASHED = CONVERT(BINARY(32), '0x9F86D081884C7D659A2FEAA0C55AD015A3BF4F1B2B0B822CD15D6C15B0F00A08', 1)
- 字符串不带
0x前缀,使用样式参数2
SELECT * FROM #TEST WHERE COL_HASHED = CONVERT(BINARY(32), '9F86D081884C7D659A2FEAA0C55AD015A3BF4F1B2B0B822CD15D6C15B0F00A08', 2)
注意事项
你的示例中哈希值带XXXXXXXX占位符,实际使用时需要替换为完整的64位十六进制字符(对应32字节二进制长度),长度不匹配也会导致查询无结果。
内容的提问来源于stack exchange,提问作者Idea
相关产品推荐
相关产品推荐

