在 SQL Server 中获取 HASHBYTES() 方法的不同结果

Ani*_*tta 5 database sql-server hash character-encoding

我正在尝试将 HASHBYTES 与 MD5 算法一起使用。但是根据数据的传递方式得到不同的结果,即,

  1. 如果使用变量传递SELECT HASHBYTES('MD5', @Var)显示结果 0xBEC062C01D70F0D2FC15F2E43EE3A66B

  2. 如果通过直接SELECT HASHBYTES('MD5', 'asd123')显示结果 0xBFD59291E825B5F2BBF1EB76569F8FE7

我使用 INSERT 插入了数据,但是当我尝试使用我的 STORED PROCEDURE 进行检索时,没有显示任何记录。

有什么我想念的吗?

Sol*_*zky 5

它与字符编码有关。您的@Var变量被声明为NVARCHAR(编码为 UTF-16 Little Endian),但字符串文字是VARCHAR(使用与当前数据库的默认排序规则关联的 8 位代码页进行编码),因为它没有以大写N.

SELECT HASHBYTES('MD5', 'asd123') AS [VARCHAR],
       HASHBYTES('MD5', N'asd123') AS [NVARCHAR];
Run Code Online (Sandbox Code Playgroud)

返回:

VARCHAR                             NVARCHAR
----------------------------------  ----------------------------------
0xBFD59291E825B5F2BBF1EB76569F8FE7  0xBEC062C01D70F0D2FC15F2E43EE3A66B
Run Code Online (Sandbox Code Playgroud)

有关完整详细的解释,请参阅我的回答:

TSQL md5 哈希与 C# .NET md5 不同