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

为何SQL中=与LIKE运算符的表现和预期相反?

SQL中=与LIKE匹配带尾随空格字符串的行为差异

在查询配置名为Default的文档时,两个看似相似的查询返回了截然不同的结果:

使用=运算符的查询

SELECT DC.ConfigurationName, DC.ConfigurationID
FROM DocumentConfiguration DC
WHERE DC.ConfigurationName='Default'

返回结果:

ConfigurationNameConfigurationID
Default1
Default2

注:第二条记录的Default带有尾随ASCII 32空格

使用LIKE运算符的查询

SELECT DC.ConfigurationName, DC.ConfigurationID
FROM DocumentConfiguration DC
WHERE DC.ConfigurationName LIKE 'Default'

返回结果:

ConfigurationNameConfigurationID
Default1

行为差异的原因

这并非运算符表现“相反”,而是SQL标准对两种运算符的字符串比较规则有明确区分:

  • =运算符:遵循ANSI SQL的空格填充比较规则——比较时会将两个字符串填充至相同长度,再逐字符对比。所以'Default'和'Default '(带尾随空格)会被填充为相同长度后判定相等,因此返回了两条记录。多数数据库(如SQL Server)默认开启ANSI_PADDING设置,会保留这种填充行为。
  • LIKE运算符:无通配符时会执行严格字符匹配,不会自动填充空格。它会精确比对字符串的每一个字符(包括长度),因此只会返回完全匹配'Default'的记录。

总结

如果需要严格匹配不含尾随空格的字符串,使用LIKE 'xxx'(无通配符)是可行的方案;也可以显式处理字符串,比如用RTRIM(DC.ConfigurationName) = 'Default',但要注意该写法可能导致索引失效,需结合实际场景选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 21:32:40