Wiem, że ten temat jest nieco kontrowersyjny i po Internecie płynie wiele różnych artykułów / opinii. Niestety większość z nich zakłada, że osoba nie wie, jaka jest różnica między NULL a pustym ciągiem. Opowiadają więc historie o zaskakujących wynikach z łączeniami / agregacjami i generalnie robią nieco bardziej zaawansowane lekcje SQL. Robiąc to, absolutnie nie rozumieją sedna i dlatego są dla mnie bezużyteczne. Mam nadzieję, że to pytanie i wszystkie odpowiedzi posuną temat nieco do przodu.
Załóżmy, że mam tabelę z danymi osobowymi (imię i nazwisko, urodzenie itp.), W której jedną z kolumn jest adres e-mail z typem varchar. Zakładamy, że z jakiegoś powodu niektóre osoby mogą nie chcieć podać adresu e-mail. Podczas wstawiania takich danych (bez wiadomości e-mail) do tabeli dostępne są dwie opcje: ustaw komórkę na NULL lub ustaw pusty ciąg (''). Załóżmy, że znam wszystkie techniczne implikacje wyboru jednego rozwiązania zamiast drugiego i mogę utworzyć poprawne zapytania SQL dla każdego scenariusza. Problem występuje nawet wtedy, gdy obie wartości różnią się na poziomie technicznym, są dokładnie takie same na poziomie logicznym. Po spojrzeniu na NULL i „” doszedłem do jednego wniosku: nie znam adresu e-mail faceta. Nie ważne jak bardzo się starałem, Nie mogłem wysłać wiadomości e-mail przy użyciu wartości NULL lub pustego ciągu, więc najwyraźniej większość serwerów SMTP zgadza się z moją logiką. Więc zwykle używam NULL, gdy nie znam wartości i uważam pusty ciąg za złą rzecz.
Po kilku intensywnych rozmowach z kolegami zadałem dwa pytania:
czy mam rację, zakładając, że użycie pustego łańcucha dla nieznanej wartości powoduje, że baza danych „kłamie” na temat faktów? Mówiąc ściślej: korzystając z idei SQL, co jest wartością, a co nie, mogę dojść do wniosku: mamy adres e-mail, po prostu odkrywając, że nie jest on zerowy. Ale później, próbując wysłać e-mail, dochodzę do sprzecznego wniosku: nie, nie mamy adresu e-mail, że @! # $ Baza danych musiała kłamać!
Czy istnieje logiczny scenariusz, w którym pusty ciąg „” mógłby być tak dobrym nośnikiem ważnych informacji (oprócz wartości i bez wartości), co byłoby kłopotliwe / nieefektywne do przechowywania w jakikolwiek inny sposób (np. Dodatkowa kolumna). Widziałem wiele postów stwierdzających, że czasami warto używać pustych ciągów wraz z rzeczywistymi wartościami i wartościami NULL, ale jak dotąd nie widziałem scenariusza, który byłby logiczny (pod względem projektu SQL / DB).
PS Niektórzy ludzie będą mieli ochotę odpowiedzieć, że to kwestia osobistego gustu. Nie zgadzam się Dla mnie jest to decyzja projektowa z ważnymi konsekwencjami. Chciałbym więc zobaczyć odpowiedzi, w których opozycja na ten temat jest poparta logicznymi i / lub technicznymi przyczynami.
''
nawet w Oracle, to nie to samo co NULL
. Na przykład przypisanie CHAR(1)
kolumny wartości ''
spowoduje ' '
(tj. Spację), a nie NULL
. Poza tym, gdyby Jacek używał Oracle, to pytanie prawdopodobnie nawet nie pojawiłoby się :-)
'' IS NULL
ewaluuje true
w PL / SQL.