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