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?
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
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