You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server生成中文UTF-8 MD5哈希值结果错误的原因及解决方法

问题描述
  • 执行英文MD5计算,结果符合预期:

    SELECT LOWER(CONVERT(VARCHAR(32), HASHBYTES('MD5', 'a'), 2));
    

    结果: 0cc175b9c0f1b6a831c399e269772661

  • 执行中文MD5计算,结果与预期不符:

    SELECT LOWER(CONVERT(VARCHAR(32), HASHBYTES('MD5', '啊'), 2));
    

    实际得到: 795d6a1c51f0ac4b0856f5cac1846f3f
    预期正确结果: 04c16ff7b157d4b4702bb24aa62651a5

原因分析

问题核心是字符编码不匹配:

  • 直接传入'啊'时,SQL Server会采用数据库默认的单字节编码(如GBK、GB2312)解析该中文字符,对应的字节流和UTF-8编码下的字节完全不同。
  • 你预期的正确MD5值是基于UTF-8编码的'啊'计算所得,原始字节流不一致,哈希结果自然不同。

解决办法

让SQL Server按UTF-8编码处理中文字符后再计算MD5,只需先将Unicode字符串转换为UTF-8字节流,再传入HASHBYTES:

SELECT LOWER(CONVERT(VARCHAR(32), HASHBYTES('MD5', CONVERT(VARBINARY(MAX), N'啊', 65001)), 2));

执行这段代码后,就能得到预期结果:04c16ff7b157d4b4702bb24aa62651a5

关键细节

  • N'啊':标记该字符串为Unicode类型(NVARCHAR),确保中文被正确识别。
  • CONVERT(VARBINARY(MAX), N'啊', 65001):将Unicode字符串转换为UTF-8编码的字节流(65001是UTF-8的代码页编号)。
  • 基于UTF-8字节流计算MD5,就能和其他UTF-8环境下的计算结果保持一致。

内容的提问来源于stack exchange,提问作者Jack W

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 15:29:56