问题:
SELECT * FROM T WHERE C1 = ' ';
返回结果错误;
明明没有' '的行,居然匹配一堆数据;
对比发现返回的都是''匹配的行
验证:
SELECT ' ' = '';
-> 1
SELECT STRCMP(' ', '');
-> 0 /* means equal */
有趣的是,
SELECT '' REGEXP '[ ]';
-> 0
SELECT '' REGEXP ' ';
-> 0
SELECT ' ' REGEXP ' ';
-> 1
google答案:
这个失败的原因在这里的文档 http://dev.mysql.com/doc/refman/5.0/en/char.html 中解释:
CHAR和VARCHAR列中的值按照排序和比较 到分配给列的字符集整理。
所有MySQL串联都是类型的PADSPACE.这意味着所有CHAR, 将MySQL中的varchar和TEXT值进行比较,而不考虑任何内容 在这种情况下,“比较”不包括 像pattern-matching运算符,尾随空间是 重要。
解决这个问题的一种方法是将其转换为BINARY
SELECT BINARY '' = ' ';
0
您还可以使用LIKE:
SELECT '' LIKE ' ';
0