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

为何使用CONCAT时有无convert得到的HashBytes结果不同?

为什么两个HashBytes的MD5结果不同?

核心原因是两个查询传入HashBytes的原始字节流完全不一样,根源在于字符串的编码类型差异:

  • 第一个查询中,convert(nvarchar,100)将数字100转换成了**nvarchar(Unicode编码)**字符串。Unicode字符串的每个字符占用2字节,拼接后的整个字符串A1001234会以双字节形式存储,比如字符'A'的字节是0x4100,数字'1'是0x3100,以此类推。
  • 第二个查询中,所有拼接的内容都是**varchar(非Unicode编码)**字符串,每个字符仅占用1字节。同样的A1001234会以单字节形式存储,字符'A'是0x41,数字'1'是0x31,字节流和第一个查询完全不同。

HashBytes函数是基于输入的原始字节序列计算哈希值的,只要输入的字节流有任何差异,最终生成的哈希结果就会不同。

你可以通过CONVERT(varbinary, ...)直观查看两种字符串的字节差异:

-- 查看Unicode版本的字节流
SELECT CONVERT(varbinary, CONCAT('A',convert(nvarchar,100),'1234')) AS unicode_bytes;
-- 查看非Unicode版本的字节流
SELECT CONVERT(varbinary, CONCAT('A','100','1234')) AS non_unicode_bytes;

执行后会看到两者的字节序列完全不同,这就是哈希结果不一样的直接原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 13:20:31