为何SQL中=与LIKE运算符的表现和预期相反?
SQL中
=与LIKE匹配带尾随空格字符串的行为差异 在查询配置名为Default的文档时,两个看似相似的查询返回了截然不同的结果:
使用=运算符的查询
SELECT DC.ConfigurationName, DC.ConfigurationID FROM DocumentConfiguration DC WHERE DC.ConfigurationName='Default'
返回结果:
| ConfigurationName | ConfigurationID |
|---|---|
| Default | 1 |
| Default | 2 |
注:第二条记录的Default带有尾随ASCII 32空格
使用LIKE运算符的查询
SELECT DC.ConfigurationName, DC.ConfigurationID FROM DocumentConfiguration DC WHERE DC.ConfigurationName LIKE 'Default'
返回结果:
| ConfigurationName | ConfigurationID |
|---|---|
| Default | 1 |
行为差异的原因
这并非运算符表现“相反”,而是SQL标准对两种运算符的字符串比较规则有明确区分:
=运算符:遵循ANSI SQL的空格填充比较规则——比较时会将两个字符串填充至相同长度,再逐字符对比。所以'Default'和'Default '(带尾随空格)会被填充为相同长度后判定相等,因此返回了两条记录。多数数据库(如SQL Server)默认开启ANSI_PADDING设置,会保留这种填充行为。LIKE运算符:无通配符时会执行严格字符匹配,不会自动填充空格。它会精确比对字符串的每一个字符(包括长度),因此只会返回完全匹配'Default'的记录。
总结
如果需要严格匹配不含尾随空格的字符串,使用LIKE 'xxx'(无通配符)是可行的方案;也可以显式处理字符串,比如用RTRIM(DC.ConfigurationName) = 'Default',但要注意该写法可能导致索引失效,需结合实际场景选择。
内容的提问来源于stack exchange,提问作者Drugtrain
相关产品推荐
相关产品推荐

