MySQL: выбор строк, где столбец равен нулю

У меня проблема, когда, когда я пытаюсь выбрать строки с NULL для определенного столбца, он возвращает пустой набор. Однако, когда я смотрю на таблицу в phpMyAdmin, она говорит null для большинства строк.

Мой запрос выглядит примерно так:

SELECT pid FROM planets WHERE userid = NULL

Пустой набор каждый раз.

Многие места сказали, чтобы убедиться, что они не сохранены как "NULL" или "null" вместо фактического значения, и один попросил поискать просто пробел (userid = ' '), но ни один из них не сработал. Было предложено не использовать MyISAM и использовать innoDB, потому что MyISAM имеет проблемы с хранением нулевого значения. Я переключил таблицу на innoDB, но теперь я чувствую, что проблема может заключаться в том, что она по-прежнему не является нулевой из-за способа ее преобразования. Я хотел бы сделать это, не создавая таблицу как innoDB или что-нибудь еще, но если это необходимо, я могу, конечно, попробовать это.

Ответ 1

SQL NULL специальный, и вам нужно сделать WHERE field IS NULL, поскольку NULL не может быть равным никому,

включая себя (то есть: NULL = NULL всегда false).

Ответ 2

SELECT pid FROM planets WHERE userid IS NULL

Ответ 3

Как всем даны ответы, я хочу добавить немного больше. Я также столкнулся с той же проблемой.

Почему ваш запрос завершился неудачей? У вас есть

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.

Ответ 4

Информация из 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

Ответ 5

Также существует оператор <=>:

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

Ответ 6

Имел ту же проблему, где запрос:

SELECT * FROM 'column' WHERE 'column' IS NULL; 

не было возвращено значений. Кажется, проблема с MyISAM, и тот же запрос на данные в InnoDB возвратил ожидаемые результаты.

Пошел с:

SELECT * FROM 'column' WHERE 'column' = ' '; 

Возврат всех ожидаемых результатов.

Ответ 7

У меня была такая же проблема при преобразовании баз данных из Access в MySQL (с помощью vb.net для связи с базой данных).

Мне нужно было оценить, было ли поле (тип поля varchar (1)) нулевым.

Этот оператор работал для моего сценария:

SELECT * FROM [table name] WHERE [field name] = ''