我只花了 2 个小时来解决我的后端问题。
原因是空字符串等于空格:
SELECT ' ' = '';
-> 1
SELECT STRCMP(' ', '');
-> 0 /* means equal */
有趣的是,
SELECT '' REGEXP '[ ]';
-> 0
SELECT '' REGEXP ' ';
-> 0
SELECT ' ' REGEXP ' ';
-> 1
我可以防止这种情况吗?是设定吗?
我只花了 2 个小时来解决我的后端问题。
原因是空字符串等于空格:
SELECT ' ' = '';
-> 1
SELECT STRCMP(' ', '');
-> 0 /* means equal */
有趣的是,
SELECT '' REGEXP '[ ]';
-> 0
SELECT '' REGEXP ' ';
-> 0
SELECT ' ' REGEXP ' ';
-> 1
我可以防止这种情况吗?是设定吗?
此处的文档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
不是普通的 MySQL 用户,但我在 MariaDB 10.2.9 上也遇到了这个问题。我通过将VARCHAR
列排序规则从更改utf8mb4_unicode_ci
为utf8mb4_unicode_nopad_ci
.
SELECT '' = ' ' COLLATE utf8mb4_unicode_ci;
结果:1
SELECT '' = ' ' COLLATE utf8mb4_unicode_nopad_ci;
结果:0