Mysql тест против значения исключает записи NULL - кто-то может объяснить? - PullRequest
4 голосов
/ 10 ноября 2011

У меня есть таблица shop_categories с полем category_is_hidden, которое определено как:

category_is_hidden tinyint(4) DEFAULT NULL

В базе данных значения этого поля либо 1, либо NULL.

SELECT * FROM shop_categories where category_is_hidden IS NULL

возвращает все пустые записи.

SELECT * FROM shop_categories where category_is_hidden <> 1

возвращает пустые множества (то есть исключает нулевые значения).

Почему это последнее утверждениене включать пустые записи?не равно нулю <> 1?

Редактировать: протестировано на MySQL 5.1 и 5.5

Ответы [ 2 ]

7 голосов
/ 10 ноября 2011

Поскольку ваш столбец category_is_hidden выглядит как флаг, я бы изменил его на tinyint (1) и сделал бы его 1 или 0 вместо 1 или NULL.Если для столбца задать значение NULL, к требованиям к хранилищу столбца будет добавлен байт, что приведет к увеличению размера индекса.

Далее задается вопрос, который вы на самом деле задали.NULL по определению НЕИЗВЕСТНО.Ваш запрос говорит: «Дайте мне все, где category_is_hidden не равен 1».Но все значения столбца NULL неизвестны.Таким образом, MySQL не знает, если они не 1. Вам нужно переписать ГДЕ как НЕ НУЛЬ.Если ваш столбец будет в трех состояниях (1, NULL, другое значение), вам нужно сделать так, чтобы в вашем WHERE было ИЛИ для этого.

3 голосов
/ 10 ноября 2011

Если поле пустое, это означает, что оно не имеет значения.Это не ноль или пустая строка.Если вы проверите, если NULL <> 1, то это не так, потому что это не число;это не что-то, и поэтому не может быть сравнено.

...