Ответ 1
SQL NULL специальный, и вам нужно сделать WHERE field IS NULL
, поскольку NULL не может быть равным никому,
включая себя (то есть: NULL = NULL всегда false).
У меня проблема, когда, когда я пытаюсь выбрать строки с NULL для определенного столбца, он возвращает пустой набор. Однако, когда я смотрю на таблицу в phpMyAdmin, она говорит null для большинства строк.
Мой запрос выглядит примерно так:
SELECT pid FROM planets WHERE userid = NULL
Пустой набор каждый раз.
Многие места сказали, чтобы убедиться, что они не сохранены как "NULL" или "null" вместо фактического значения, и один попросил поискать просто пробел (userid = ' '
), но ни один из них не сработал. Было предложено не использовать MyISAM и использовать innoDB, потому что MyISAM имеет проблемы с хранением нулевого значения. Я переключил таблицу на innoDB, но теперь я чувствую, что проблема может заключаться в том, что она по-прежнему не является нулевой из-за способа ее преобразования. Я хотел бы сделать это, не создавая таблицу как innoDB или что-нибудь еще, но если это необходимо, я могу, конечно, попробовать это.
SQL NULL специальный, и вам нужно сделать WHERE field IS NULL
, поскольку NULL не может быть равным никому,
включая себя (то есть: NULL = NULL всегда false).
SELECT pid FROM planets WHERE userid IS NULL
Как всем даны ответы, я хочу добавить немного больше. Я также столкнулся с той же проблемой.
Почему ваш запрос завершился неудачей? У вас есть
SELECT pid FROM planets WHERE userid = NULL;
Это не даст ожидаемого результата, потому что из mysql doc
В SQL значение NULL никогда не является истинным по сравнению с любым другим значением, даже NULL. Выражение, содержащее NULL, всегда выдает значение NULL, если в документации для операторов и функций не указано иное участвует в выражении.
Акцент мой.
Для поиска значений столбцов, которые являются
NULL
, вы не можете использовать тестexpr = NULL
. Следующий оператор не возвращает строки, потому чтоexpr = NULL
никогда не является истинным для любого выражения
SELECT pid FROM planets WHERE userid IS NULL;
Для тестирования NULL
используйте операторы IS NULL
и IS NOT NULL
.
NULL
.NULL
.Информация из http://w3schools.com/sql/sql_null_values.asp:
1) Значения NULL представляют отсутствующие неизвестные данные.
2) По умолчанию столбец таблицы может содержать значения NULL.
3) Значения NULL обрабатываются иначе, чем другие значения
4) Невозможно сравнить NULL и 0; они не эквивалентны.
5) Невозможно проверить значения NULL при сравнении операторы, такие как =, <, или < > .
6) Нам нужно будет использовать операторы IS NULL и NOT NULL вместо
Итак, в случае вашей проблемы:
SELECT pid FROM planets WHERE userid IS NULL
Также существует оператор <=>
:
SELECT pid FROM planets WHERE userid <=> NULL
Будет работать. Приятно, что <=>
также может использоваться с значениями, отличными от NULL:
SELECT NULL <=> NULL
дает 1
.
SELECT 42 <=> 42
также дает 1
.
Смотрите здесь: https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#operator_equal-to
Имел ту же проблему, где запрос:
SELECT * FROM 'column' WHERE 'column' IS NULL;
не было возвращено значений. Кажется, проблема с MyISAM, и тот же запрос на данные в InnoDB возвратил ожидаемые результаты.
Пошел с:
SELECT * FROM 'column' WHERE 'column' = ' ';
Возврат всех ожидаемых результатов.
У меня была такая же проблема при преобразовании баз данных из Access в MySQL (с помощью vb.net для связи с базой данных).
Мне нужно было оценить, было ли поле (тип поля varchar (1)) нулевым.
Этот оператор работал для моего сценария:
SELECT * FROM [table name] WHERE [field name] = ''