Сравнение нулей и пустых строк в 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.