Mam problem polegający na tym, że gdy próbuję wybrać wiersze z wartością NULL dla określonej kolumny, zwraca pusty zestaw. Jednak gdy patrzę na tabelę w phpMyAdmin, dla większości wierszy jest ona pusta.
Moje zapytanie wygląda mniej więcej tak:
SELECT pid FROM planets WHERE userid = NULL
Pusty zestaw za każdym razem.
Wiele miejsc mówi, aby upewnić się, że nie jest przechowywany jako „NULL” lub „null” zamiast rzeczywistej wartości, a jeden z nich powiedział, że należy poszukać spacji ( userid = ' '
), ale żadne z nich nie zadziałało. Sugerowano, aby nie używać MyISAM i używać innoDB, ponieważ MyISAM ma problemy z przechowywaniem wartości null. Zmieniłem tabelę na innoDB, ale teraz wydaje mi się, że problem może polegać na tym, że wciąż nie jest zerowy z powodu sposobu, w jaki może go przekonwertować. Chciałbym to zrobić bez konieczności odtwarzania tabeli jako innoDB lub czegokolwiek innego, ale jeśli będę musiał, z pewnością mogę tego spróbować.
Odpowiedzi:
SQL NULL jest wyjątkowy i musisz to zrobić
WHERE field IS NULL
, ponieważ NULL nie może być niczym,w tym siebie (tj .: NULL = NULL jest zawsze fałszem).Zobacz
Rule 3
https://en.wikipedia.org/wiki/Codd%27s_12_rulesźródło
select * from foo where bar <> "abc"
będzie nie zwracać wierszy, gdzie bar jest null. To rzuciło mnie dzisiaj na pętlę. Dokumenty nazywają<>
operator „nie równy”, ale tak naprawdę to „równa się operatorowi innemu niż”.źródło
Ponieważ wszyscy otrzymują odpowiedzi, chcę dodać trochę więcej. Zetknąłem się również z tym samym problemem.
Dlaczego zapytanie nie powiodło się? Ty masz,
To nie da oczekiwanego rezultatu, ponieważ z mysql doc
Podkreśl moje.
Rozwiązanie
Aby to sprawdzić
NULL
, użyj operatorówIS NULL
iIS NOT NULL
.NULL
.NULL
.źródło
Istnieje również
<=>
operator:Pracowałbym. Zaletą jest to, że
<=>
można go również używać z wartościami innymi niż NULL:SELECT NULL <=> NULL
daje1
.SELECT 42 <=> 42
daje1
również.Zobacz tutaj: https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#operator_equal-to
źródło
Informacje z http://w3schools.com/sql/sql_null_values.asp :
W razie problemu:
źródło
Miał ten sam problem, w którym zapytanie:
nie zwrócił żadnych wartości. Wygląda na problem z MyISAM, a to samo zapytanie dotyczące danych w InnoDB zwróciło oczekiwane wyniki.
Poszedł z:
Zwrócono wszystkie oczekiwane wyniki.
źródło
źródło
Miałem ten sam problem podczas konwersji baz danych z Access na MySQL (używanie vb.net do komunikacji z bazą danych).
Musiałem ocenić, czy pole (typ pola varchar (1)) było puste.
To oświadczenie zadziałało w moim scenariuszu:
źródło