MySQL使空白很重要

Mik*_*ail 9 mysql

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

Pek*_*ica 6

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

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

...

特别是,尾随空格很重要,对于使用=运算符执行的CHAR或VARCHAR比较,情况并非如此......

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

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

由tombom建议的二进制比较也是一种选择,但是会有其他副作用(比如变音符号的更严格的比较,例如.A并且Ä会有所不同),你可能想要也可能不想要.有关在此问题中使用二进制比较的效果的更多信息.


van*_*van 2

您可以使用喜欢

SELECT "A" LIKE "A ";
Run Code Online (Sandbox Code Playgroud)

将返回 0 但是

SELECT "A" LIKE "A";
Run Code Online (Sandbox Code Playgroud)

返回 1