我有一个名为USER
的表和一个名为UserPassword varchar(100)
的列。
如果我查询user
表:
SELECT UserPassword
FROM "USER"
它返回
0x9F19488027B745FA80E2C27F3DCDCD5D7845AA74B12AB26882F617D0517F73B8
如果我查询值:
SELECT HASHBYTES('SHA2_256', '13149066');
它返回
0x9F19488027B745FA80E2C27F3DCDCD5D7845AA74B12AB26882F617D0517F73B8
此时两个结果都匹配且具有相同的数据类型。
但是当我试图匹配它们时,我没有得到任何结果。
SELECT "Name"
FROM "USER"
WHERE UserPassword = HASHBYTES('SHA2_256', '13149066');
返回:
0 records found
我也试过了:
SELECT "Name"
FROM "USER"
WHERE UserPassword = HASHBYTES('SHA2_256', CAST('13149066' AS varchar(100)));
返回:
0 records found.
此查询有什么问题?
答案 0 :(得分:6)
这些记录不一样。 HASHBYTES返回VARBINARY类型。
你可以在这里看到:
select binary_checksum(CAST('0x9F19488027B745FA80E2C27F3DCDCD5D7845AA74B12AB26882F617D0517F73B8' AS VARCHAR(8000)))
SELECT binary_checksum(HASHBYTES('SHA2_256', '13149066'))
varchar vs varbinary不匹配。您需要将它们转换为相同的类型或更改用户表上的数据类型,以将pw哈希存储为varbinary(8000)。
https://docs.microsoft.com/en-us/sql/t-sql/functions/hashbytes-transact-sql
答案 1 :(得分:0)
谢谢dfundako。 你的答案很有帮助
我只是将密码字段的数据类型更改为int,我执行了此操作
SELECT "Name" from "USER"
where UserPassword = binary_checksum(HASHBYTES('SHA2_256', '13149066'))
我得到了渴望的结果。