Интересное поведение mysql при выборке из таблицы содержащей NULL

Столкнулся с интересным поведением MySQL при выборке из таблицы содержащей NULL в качестве значения.  Очередной подвох однако.. Пусть например есть таблица:

mysql> select cat_idx,uuid from categories where tar_id=109 and common=0 and above=1 and archive=0;
+---------+------+
| cat_idx | uuid |
+---------+------+
|       0 | NULL |
|       5 | NULL |
|      10 | NULL |
|      11 | NULL |
|      15 | NULL |
|      28 | peni |
+---------+------+
6 rows in set (0.00 sec)

Хотим получить все значения не содержащие uuid=»peni». Логично было бы использовать такой запрос:

mysql> select cat_idx,uuid from categories where tar_id=109 and common=0 and above=1 and archive=0 and uuid<>"peni";
Empty set (0.00 sec)

Аааа. А куда делись остальные значения? А вот потому что с точки зрения MySQL правильно будет:


mysql> select cat_idx,uuid from categories where tar_id=109 and common=0 and above=1 and archive=0 and (uuid<>"peni" or uuid is null);
+---------+------+
| cat_idx | uuid |
+---------+------+
|       0 | NULL |
|       5 | NULL |
|      10 | NULL |
|      11 | NULL |
|      15 | NULL |
+---------+------+
5 rows in set (0.00 sec)


Вывод: при создании таблиц нужно стараться заполнять поля значениями «по умолчанию». Чтобы NULL не было в принципе. Тогда и возможной ошибки не будет.

 

Комментарии:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.