【问题标题】:MySQL making whitespace matterMySQL使空格很重要
【发布时间】:2012-07-02 22:48:56
【问题描述】:

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

【问题讨论】:

  • 二进制比较将防止删除尾随空格:SELECT BINARY 'a ' = BINARY 'a';

标签: mysql


【解决方案1】:

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

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

...

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

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

手册没有说明 STRCMP() 在空格方面是否比 = 更严格,我现在不能尝试 - 这可能也值得一看,因为它可以做到更清楚为什么 = 没有被使用。

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

【讨论】:

  • STRCMP 的行为似乎与= 相同。而LIKE 也注意大小写。谢谢!
  • @Mikhail 啊,所以都不适合你?太糟糕了。那么我猜二进制比较是唯一的方法
【解决方案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

【讨论】:

  • +1,但请注意,这也可能会改变其他行为(如元音变音的比较)
【解决方案3】:

你可以使用 LIKE

SELECT "A" LIKE "A ";

将返回 0 但

SELECT "A" LIKE "A";

返回 1

【讨论】:

    猜你喜欢
    • 2012-10-03
    • 1970-01-01
    • 2011-02-10
    相关资源
    最近更新 更多