显然是一个非常罕见的问题,但IMO非常讨厌和错误:MySQL中的尾随空格不用于比较:
mysql> SELECT "A" = "A ";
+------------+
| "A" = "A " |
+------------+
| 1 |
+------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
在以下情况中,这尤其成问题:
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
Run Code Online (Sandbox Code Playgroud)
有没有办法配置MySQL正确处理空白?
根据手册,一个快速解决方法是使用LIKE:
根据SQL标准,LIKE基于每个字符执行匹配,因此它可以产生与=比较运算符不同的结果:
...
特别是,尾随空格很重要,对于使用=运算符执行的CHAR或VARCHAR比较,情况并非如此......
只要你不使用任何通配符,这应该是相同的=.这个Stack Overflow问题似乎支持这样的假设:Equals(=)vs. LIKE
手册没有说明是否STRCMP()比=空白更严格,我现在无法尝试 - 这也许值得一看,因为它更清楚为什么 =不使用.
由tombom建议的二进制比较也是一种选择,但是会有其他副作用(比如变音符号的更严格的比较,例如.A并且Ä会有所不同),你可能想要也可能不想要.有关在此问题中使用二进制比较的效果的更多信息.
您可以使用喜欢
SELECT "A" LIKE "A ";
Run Code Online (Sandbox Code Playgroud)
将返回 0 但是
SELECT "A" LIKE "A";
Run Code Online (Sandbox Code Playgroud)
返回 1