mysql, space equals empty string

对着背影说爱祢 提交于 2019-12-01 01:15:54

问题


Just took me 2 hours to troubleshoot an issue on my backend.

Cause was that of empty string being equal to space:

SELECT ' ' = '';
-> 1

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

Interestingly enough,

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

Can I prevent this? Is it a setting?


回答1:


The reason this fails is explained in the docs here http://dev.mysql.com/doc/refman/5.0/en/char.html:

Values in CHAR and VARCHAR columns are sorted and compared according to the character set collation assigned to the column.

All MySQL collations are of type PADSPACE. This means that all CHAR, VARCHAR, and TEXT values in MySQL are compared without regard to any trailing spaces. “Comparison” in this context does not include the LIKE pattern-matching operator, for which trailing spaces are significant.

One way to work around this would be to cast as BINARY

SELECT BINARY '' = ' ';
0

You can also use LIKE:

SELECT '' LIKE ' ';
0



回答2:


Not a vanilla MySQL user, but I was having this problem with MariaDB 10.2.9 as well. I solved it by changing my VARCHAR column collation from utf8mb4_unicode_ci to utf8mb4_unicode_nopad_ci.

SELECT '' = ' ' COLLATE utf8mb4_unicode_ci;
Result: 1

SELECT '' = ' ' COLLATE utf8mb4_unicode_nopad_ci;
Result: 0



来源:https://stackoverflow.com/questions/34782594/mysql-space-equals-empty-string

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!