MySQL使空白很重要

时间:2012-07-02 13:51:44

标签: mysql

显然是一个非常罕见的问题,但IMO非常讨厌和错误:MySQL中的尾随空格不会用于比较:

mysql> SELECT "A" = "A ";
+------------+
| "A" = "A " |
+------------+
|          1 |
+------------+
1 row in set (0.00 sec)

在以下情况中,这尤其成问题:

mysql> SELECT COUNT(*) FROM eq WHERE name != TRIM(name);
+------------+
| COUNT(*)   |
+------------+
|          0 |
+------------+
1 row in set (0.00 sec)

mysql> UPDATE eq SET name=TRIM(name);
Query OK, 866 row affected (0.01 sec)
Rows matched: 650907  Changed: 866  Warnings: 0

有没有办法配置MySQL来正确处理空白?

3 个答案:

答案 0 :(得分:6)

根据the manual,一个快速解决方法是使用LIKE:

  

根据SQL标准,LIKE在每个字符的基础上执行匹配,因此它可以产生与=比较运算符不同的结果:

     

...

     

特别是,尾随空格很重要,对于使用=运算符执行的CHAR或VARCHAR比较不是这样......

只要您不使用任何通配符,这应该与=相同。此Stack Overflow问题似乎支持这样的假设:Equals(=) vs. LIKE

手册没有说明STRCMP()在空白方面是否比=更严格,而且我现在无法尝试 - 这也许值得一看,因为它更清楚为什么不使用 =

tombom建议的二进制比较也是一种选择,但是会有其他副作用(比如对于变音符号的更严格的比较,例如。AÄ会有所不同)可能不想要。有关在this question.

中使用二进制比较的效果的更多信息

答案 1 :(得分:2)

您可以使用LIKE

SELECT "A" LIKE "A ";

将返回0但

SELECT "A" LIKE "A";

返回1

答案 2 :(得分:2)

二元比较是神奇的词。

Binary Comparison in MySQL Manual

mysql> SELECT 'a' = 'A';
        -> 1
mysql> SELECT BINARY 'a' = 'A';
        -> 0
mysql> SELECT 'a' = 'a ';
        -> 1
mysql> SELECT BINARY 'a' = 'a ';
        -> 0