NVARCHAR与字母N搭配时CHECKSUM函数的异常问题咨询
NVARCHAR类型值'N '的CHECKSUM返回0是否属于可上报Bug?
当NVARCHAR(250)列或变量存储值为'N '时,CHECKSUM函数返回结果为0,推测CHECKSUM将字母N视为转换尾随空格为UNICODE的标识。目前可通过将数据类型改为varchar来规避此问题,现确认该情况是否属于可上报的Bug。
测试代码
DECLARE @TestN NVARCHAR(250) = 'N ' DECLARE @TestV VARCHAR(250) = 'N ' DECLARE @TestN2 NVARCHAR(250) = 'P ' DECLARE @TestV2 VARCHAR(250) = 'P ' SELECT CHECKSUM(@TestN) AS [ckTest DATATYPE NVARCHAR], CHECKSUM(TRIM(@TestN)) AS ckTestTRIM SELECT CHECKSUM(@TestV) AS [ckTest DATATYPE VARCHAR], CHECKSUM(TRIM(@TestV)) AS ckTestTRIMV SELECT CHECKSUM(@TestN2) AS [ckTest DATATYPE NVARCHAR P], CHECKSUM(TRIM(@TestN2)) AS ckTestTRIM SELECT CHECKSUM(@TestV2) AS [ckTest DATATYPE VARCHAR P], CHECKSUM(TRIM(@TestV2)) AS ckTestTRIMP
分析与结论
- CHECKSUM的预期行为:CHECKSUM基于输入数据的类型和字符编码计算校验和,同一数据类型下,内容不同的字符串应返回不同的校验和(除非极低概率的哈希碰撞)。
- 异常点验证:测试中仅NVARCHAR类型的
'N '出现CHECKSUM返回0的情况,且与TRIM后的'N'校验和一致;而NVARCHAR类型的'P '、VARCHAR类型的'N '/'P '均符合预期(原字符串与TRIM后字符串的校验和不同)。 - Bug判定:这种仅特定字符组合触发的异常行为,违反了CHECKSUM函数的一致性逻辑,属于可上报的Bug。
内容的提问来源于stack exchange,提问作者ChrisJ
相关产品推荐
相关产品推荐

