9

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

4

3 回答 3

6

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

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

...

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

只要您不使用任何通配符,这应该与=. 这个 Stack Overflow 问题似乎支持以下假设:Equals(=) vs. LIKE

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

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

于 2012-07-02T13:56:17.260 回答
2

您可以使用 LIKE

SELECT "A" LIKE "A ";

将返回 0 但

SELECT "A" LIKE "A";

返回 1

于 2012-07-02T13:56:03.987 回答
2

二进制比较是一个神奇的词。

MySQL手册中的二进制比较

mysql> SELECT 'a' = 'A';
        -> 1
mysql> SELECT BINARY 'a' = 'A';
        -> 0
mysql> SELECT 'a' = 'a ';
        -> 1
mysql> SELECT BINARY 'a' = 'a ';
        -> 0
于 2012-07-02T13:56:33.183 回答