MySQL: выбор строк, где столбец равен null
у меня проблема, когда я пытаюсь выбрать строки, которые имеют значение NULL для определенного столбца, он возвращает пустой набор. Однако, когда я смотрю на таблицу в phpMyAdmin, она говорит null для большинства строк.
мой запрос выглядит примерно так:
SELECT pid FROM planets WHERE userid = NULL
пустой набор каждый раз.
многие места сказали, чтобы убедиться, что он не хранится как "NULL" или "null" вместо фактического значения, и один сказал, чтобы попытаться найти только пробел (userid = ' '
) но никто из них сработали. Было предложено не использовать MyISAM и использовать innoDB, потому что MyISAM имеет проблемы с хранением null. Я переключил таблицу на innoDB, но теперь я чувствую, что проблема может быть в том, что она все еще не является нулевой из-за того, как она может преобразовать ее. Я хотел бы сделать это без необходимости воссоздавать таблицу как innoDB или что-то еще, но если мне придется, я, конечно, могу попробовать.
8 ответов
SQL NULL специальный, и вы должны сделать WHERE field IS NULL
, поскольку NULL не может быть равен ничему,
включая себя (т. е.: NULL = NULL всегда false).
посмотреть Rule 3
https://en.wikipedia.org/wiki/Codd%27s_12_rules
поскольку все ответы даны, я хочу добавить немного больше. Я также столкнулся с той же проблемой.
почему ваш запрос не удался? Вы,
SELECT pid FROM planets WHERE userid = NULL;
это не даст вам ожидаемого результата, потому что от mysql doc
в SQL, значение NULL никогда не является истинным по сравнению с любым другим значением, даже NULL. выражение, содержащее NULL, всегда создает значение NULL, если иное не указано в документация для операторов и функций, участвующих в выражении.
выделено мной.
поиск значений столбцов
NULL
, вы не можете использовать
информация из http://w3schools.com/sql/sql_null_values.asp:
1) значения NULL представляют отсутствующие неизвестные данные.
2) по умолчанию столбец таблицы может содержать значения NULL.
3) значения NULL обрабатываются иначе, чем другие значения
4) невозможно сравнить NULL и 0; они не эквивалентны.
5) невозможно проверить нулевые значения при сравнении операторы, например=,.
6) нам придется использовать операторы IS NULL и is NOT null вместо
Так, в случае вашей проблемы:
SELECT pid FROM planets WHERE userid IS NULL
есть еще <=>
оператор:
SELECT pid FROM planets WHERE userid <=> 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] = ''