显然是一个非常罕见的问题,但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来正确处理空白?
答案 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