[ Content | View menu ]

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

«
»

0 комментариев

Write a comment - TrackBack - RSS Comments

Write comment

Я не робот.