Интересное поведение mysql при выборке из таблицы содержащей NULL
Столкнулся с интересным поведением MySQL при выборке из таблицы содержащей NULL в качестве значения. Очередной подвох однако.. Пусть например есть таблица:
1 2 3 4 5 6 7 8 9 10 11 12 |
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». Логично было бы использовать такой запрос:
1 2 |
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 правильно будет:
1 2 3 4 5 6 7 8 9 10 11 |
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 не было в принципе. Тогда и возможной ошибки не будет.