如果数据库行是这样的:country = 'usa'
并且我查询"select * from data where country = 'usa '"
它也会返回此行。所以它不完全匹配。
为什么MySQL会这样做?而在其他情况下,当它不是真的时,它也将返回TRUE?
答案 0 :(得分:9)
如the manual中所述:
所有MySQL排序规则都是
PADSPACE
类型。这意味着MySQL中的所有CHAR
和VARCHAR
值都会进行比较,而不考虑任何尾随空格。
在LIKE
运算符的定义中,它指出:
如this answer中所述:
此行为在SQL-92和SQL:2008中指定。为了进行比较,较短的字符串被填充到较长字符串的长度。
从草案(8.2<比较谓词>):
如果X的字符长度不等于Y的字符长度,那么为了比较的目的,较短的字符串被有效地替换为已经延长到较长的长度的自身的副本。字符串通过串联在一个或多个填充字符的右侧,其中填充字符是基于CS选择的。如果CS具有NO PAD特性,则填充字符是与实现有关的字符,不同于X和Y字符集中的任何字符,其整理的字符串少于CS下的任何字符串。否则,填充字符是< space>。
除了其他优秀的解决方案:
select binary 'a' = 'a '
答案 1 :(得分:4)
如果列的类型为char
或varchar
,则省略尾随空格;使用like 'usa '
解决问题
答案 2 :(得分:1)
使用like
或使用此
country = 'usa ' AND LENGTH(country) = LENGTH('usa ')
答案 3 :(得分:0)
如果列的类型为char或varchar,
,则省略尾随空格可以在以下链接上阅读更多内容:
答案 4 :(得分:0)
手册说明了这一点:
所有MySQL排序规则都是PADSPACE类型。这意味着所有CHAR MySQL中的VARCHAR值与VARCHAR值进行比较而不考虑任何值 尾随空格[...]对于所有MySQL版本都是如此,并且不受服务器SQL模式的影响。
http://dev.mysql.com/doc/refman/5.5/en/char.html
如果你需要考虑空白,你基本上必须摆脱语言感知排序。一种简单的方法是强制进行二进制整理。请运行并比较:
SELECT 'ab'='ab ', BINARY 'ab'='ab '