【发布时间】:2012-05-16 18:20:37
【问题描述】:
如果数据库行是这样的:country = 'usa' 并且我查询 "select * from data where country = 'usa '" 它也会返回这一行。所以不是完全匹配。
为什么 MySQL 会这样做?在其他什么情况下,当它不是真的时,它也会返回 TRUE?
【问题讨论】:
标签: mysql comparison-operators
如果数据库行是这样的:country = 'usa' 并且我查询 "select * from data where country = 'usa '" 它也会返回这一行。所以不是完全匹配。
为什么 MySQL 会这样做?在其他什么情况下,当它不是真的时,它也会返回 TRUE?
【问题讨论】:
标签: mysql comparison-operators
如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 下的任何字符串。否则,填充字符是
。 除了其他优秀的解决方案:
select binary 'a' = 'a '
【讨论】:
如果列的类型为char 或varchar,则省略尾随空格;使用like 'usa ' 解决问题
【讨论】:
用like 或这个试试
country = 'usa ' AND LENGTH(country) = LENGTH('usa ')
【讨论】:
如果列是 char 或 varchar 类型,则省略尾随空格,
可以通过以下链接阅读更多内容:
【讨论】:
手册是这样说的:
所有 MySQL 排序规则都是 PADSPACE 类型。这意味着所有 CHAR 和 MySQL 中的 VARCHAR 值进行比较而不考虑任何 尾随空格 [...] 这适用于所有 MySQL 版本,并且不受服务器 SQL 模式的影响。
http://dev.mysql.com/doc/refman/5.5/en/char.html
如果您需要考虑空格,则基本上必须摆脱语言感知排序。一种简单的方法是强制进行二进制排序。请运行并比较:
SELECT 'ab'='ab ', BINARY 'ab'='ab '
【讨论】:
BINARY 运算符不是“强制二进制排序规则”,这可以通过应用COLLATE *_bin 子句来完成,而是将其非二进制操作数转换为二进制字符串——这样做的效果是,比较完全是逐字节进行的,这类似于二进制排序规则(除了二进制排序规则仍然是 PADSPACE)。读者可能会发现了解这种差异很有用,在手册部分The _bin and binary Collations中有更详细的解释。