13

我只花了 2 个小时来解决我的后端问题。

原因是空字符串等于空格:

SELECT ' ' = '';
-> 1

SELECT STRCMP(' ', '');
-> 0 /* means equal */

有趣的是,

SELECT '' REGEXP '[ ]';
-> 0
SELECT '' REGEXP ' ';
-> 0
SELECT ' ' REGEXP ' ';
-> 1

我可以防止这种情况吗?是设定吗?

4

2 回答 2

12

此处的文档http://dev.mysql.com/doc/refman/5.0/en/char.html解释了失败的原因:

CHAR 和 VARCHAR 列中的值根据分配给列的字符集排序规则进行排序和比较。

所有 MySQL 排序规则都是 PADSPACE 类型。这意味着在比较 MySQL 中的所有 CHAR、VARCHAR 和 TEXT 值时,不考虑任何尾随空格。在这种情况下,“比较”不包括 LIKE 模式匹配运算符,因为尾随空格很重要。

解决此问题的一种方法是强制转换为BINARY

SELECT BINARY '' = ' ';
0

您还可以使用LIKE

SELECT '' LIKE ' ';
0
于 2016-01-14T06:02:11.010 回答
2

不是普通的 MySQL 用户,但我在 MariaDB 10.2.9 上也遇到了这个问题。我通过将VARCHAR列排序规则从更改utf8mb4_unicode_ciutf8mb4_unicode_nopad_ci.

SELECT '' = ' ' COLLATE utf8mb4_unicode_ci;
结果:1

SELECT '' = ' ' COLLATE utf8mb4_unicode_nopad_ci;
结果:0

于 2018-12-29T19:18:34.677 回答