Сравнение нулей и пустых строк в MySQL
Опубликовано 06.11.2009
Коллега поделился парадоксом:
Server version: 5.0.51a-24+lenny1 (Debian) mysql> select '0'=0; +-------+ | '0'=0 | +-------+ | 1 | +-------+ 1 row in set (0.00 sec) mysql> select 0=''; +------+ | 0='' | +------+ | 1 | +------+ 1 row in set (0.00 sec) mysql> select ''='0'; +--------+ | ''='0' | +--------+ | 0 | +--------+ 1 row in set (0.00 sec)
Если два значения равны третьему, они не равны между собой, что немного противоречит здравому смыслу. Однако такое поведение легко можно объяснить, если вчитаться в документацию, а именно в пункт Type Conversion in Expression Evaluation, где чёрным по белому написано, что если оба аргумента одновременно не являются ни строками, ни числами и при этом ни один из них не NULL, не TIMESTAMP и не DATETIME, то при сравнении эти аргументы преобразуются в числа с плавающей точкой. Пустая строка '' и строковой нуль '0' при сравнении с числом 0 одинаково преобразуются в 0:
mysql> select cast(0 as signed), cast('' as signed);
+-------------------+--------------------+
| cast(0 as signed) | cast('' as signed) |
+-------------------+--------------------+
| 0 | 0 |
+-------------------+--------------------+
Поэтому в первых двух случаях сравнение возвращает true. А в последнем сравнении преобразования строк в числа не происходит (т.к. сравниваются две строки), поэтому false.
