MSSQL中TSQL字符串等值匹配返回多余行原因问询
TSQL字符串等值匹配返回多余结果的原因
根本逻辑
这是ANSI SQL-92标准明确规定的字符串比较规则,SQL Server完全遵循该规则:
- 使用
=做等值比较时,会先将较短的字符串尾部补空格,直到两个字符串长度相同,再逐字符比对内容 - 该填充仅发生在比较过程中,不会修改表中存储的原始数据
针对你的示例的具体说明
你的变量@C是VARCHAR(2)类型,值为'A '(A加1个空格,总长度2),表中id=1的记录存储的字符串为'A'(长度1):
- 执行
string = @C判断时,SQL Server会自动把长度更短的'A'尾部补1个空格,填充为长度2的'A ' - 填充后的内容和
@C完全一致,因此会被判定为匹配,最终返回了id=1和id=2两条记录
相关补充
你提到的LIKE语法不会触发该规则,因为LIKE属于模式匹配逻辑,不会自动填充尾部空格,会严格逐字符匹配内容,因此可以得到你预期的结果。
如果需要使用等值判断同时严格区分尾部空格,可以额外比对字符串的实际字节长度:
SELECT * FROM @T WHERE string = @C AND DATALENGTH(string) = DATALENGTH(@C)
DATALENGTH函数会返回字符串实际占用的字节数,尾部空格也会被正常计算,因此可以实现严格匹配的需求。
内容的提问来源于stack exchange,提问作者David Mrazek
相关产品推荐
相关产品推荐

