Interesuję się głównie MySQL i PostgreSQL, ale ogólnie możesz odpowiedzieć na następujące pytania:
- Czy istnieje logiczny scenariusz, w którym przydatne byłoby odróżnienie pustego ciągu od NULL?
Jakie byłyby implikacje fizycznego przechowywania dla przechowywania pustego ciągu jako ...
- ZERO?
- Pusta struna?
- Kolejne pole?
- Jakikolwiek inny sposób?
null
feature-comparison
empty-string
Maniero
źródło
źródło
NULL
lub nieNie wiem o MySQL i PostgreSQL, ale pozwól mi potraktować to trochę ogólnie.
Jest jeden DBMS, a mianowicie Oracle, który nie pozwala wybrać użytkowników pomiędzy NULL a „”. To wyraźnie pokazuje, że nie jest konieczne rozróżnienie między nimi. Istnieją pewne irytujące konsekwencje:
Ustawiasz varchar2 na pusty ciąg taki jak ten:
następujące prowadzi do tego samego wyniku
Ale aby wybrać kolumny, w których wartość jest pusta lub NULL, musisz użyć
Za pomocą
jest poprawny pod względem składniowym, ale nigdy nie zwraca wiersza.
Z drugiej strony, podczas łączenia łańcuchów w Oracle. Warchary NULL są traktowane jako puste ciągi.
daje abc . W innych przypadkach DBMS zwróciłoby wartość NULL.
Jeśli chcesz wyraźnie wyrazić, że wartość jest przypisana, musisz użyć czegoś takiego jak ''.
I musisz się martwić, czy przycinanie niepustych wyników daje NULL
To robi.
Teraz patrząc na DBMS, gdzie „” nie jest identyczne z NULL (np. SQL-Server)
Praca z „” jest na ogół łatwiejsza iw większości przypadków nie ma praktycznej potrzeby rozróżnienia między nimi. Jednym z wyjątków, jaki znam, jest sytuacja, gdy kolumna reprezentuje jakieś ustawienie i nie ma dla nich pustych ustawień domyślnych. Kiedy możesz rozróżnić „” i „NULL”, możesz wyrazić, że twoje ustawienie jest puste i uniknąć domyślnego ustawienia.
źródło
To zależy od domeny, nad którą pracujesz.
NULL
oznacza brak wartości (tzn. nie ma wartości ), a pusty ciąg oznacza, że istnieje ciąg o zerowej długości.Załóżmy na przykład, że masz tabelę do przechowywania danych osoby i zawiera ona
Gender
kolumnę. Możesz zapisać wartości jako „Mężczyzna” lub „Kobieta”. Jeśli użytkownik może zdecydować o nieudostępnianiu danych dotyczących płci, należy zapisać to jakoNULL
(tj. Użytkownik nie podał wartości), a nie pusty ciąg znaków (ponieważ nie ma płci o wartości „”).źródło
Jedną rzeczą, o której warto pamiętać, jest to, że gdy masz pole, które nie jest wymagane, ale wszystkie obecne wartości muszą być unikalne, będziesz musiał przechowywać puste wartości jako NULL. W przeciwnym razie będziesz mieć tylko jedną krotkę z pustą wartością w tym polu.
Istnieją również pewne różnice w algebrze relacyjnej i wartościach NULL: na przykład NULL! = NULL.
źródło
UNIQUE
ograniczenie. Na szczęście, począwszy od 2008 roku, można użyć filtrowanego indeksu, aby uzyskać prawidłowe zachowanie.Możesz także wziąć pod uwagę krytykę NULL Data i problemy 3VL w SQL i Teorii Relacyjnej (oraz krytykę Rubinsona krytyki Date, Nulls, Three-Valued Logic i Ambiguity in SQL: Critiquing Date's Critique ).
Oba są przywoływane i omawiane szczegółowo w powiązanym wątku SO, Opcje eliminowania NULLable kolumn z modelu DB .
źródło
Nowa myśl, duży wpływ na wybór
NULL
/NOT NULL
dotyczy tego, czy używasz frameworka. Używam dużo symfony i używanieNULL
pól zezwalających upraszcza sprawdzanie kodu i danych podczas manipulowania danymi.Jeśli nie używasz frameworka lub używasz prostych instrukcji SQL i przetwarzania, wybrałbym wybór, który Twoim zdaniem jest łatwiejszy do śledzenia. Zazwyczaj wolę NULL, aby wykonywanie
INSERT
instrukcji nie było uciążliwe, gdy zapomniałem ustawić puste pola naNULL
.źródło
Po pracy z Oracle ( co nie pozwala na rozróżnienie ) doszedłem do następującego wniosku:
Z logicznego POV to nie ma znaczenia. Naprawdę nie mogę wymyślić przekonującego przykładu, w którym rozróżnienie między ciągiem NULL a ciągiem o zerowej długości dodaje jakąkolwiek wartość w DBMS.
Z czego wynika: albo masz
NULL
kolumnę zdolną, która nie pozwala zerowej wartości''
(rozwiązanie Oracle) lubNOT NULL
kolumnę, która pozwala zerowej wartości.Z mojego doświadczenia wynika, że przetwarzanie danych
''
ma o wiele większy sens, ponieważ normalnie chcesz przetwarzać brak ciągu jako pusty ciąg: Łączenie, porównywanie itp.Uwaga: Aby wrócić do mojego doświadczenia z Oracle: Powiedz, że chcesz wygenerować zapytanie dotyczące żądania wyszukiwania. Jeśli używasz
''
, możesz po prostu wygenerowaćWHERE columnX = <searchvalue>
i będzie działać dla wyszukiwania równości. Jeśli używaszNULL
, musisz zrobićWHERE columnX=<searchvalue> or (columnX is NULL and serchvalue is NULL)
. Bah! :-)źródło
Różnią się także od perspektywy projektowania:
na przykład
Wygląda jak:
Pozwala wstawić niektóre dane:
Teraz spróbujmy z zerowym:
To jest dozwolone.
Soooooo: wartości null nie są trywialnymi łańcuchami ani odwrotnością.
Twoje zdrowie
źródło
Jeśli mówimy o teorii, wówczas zasady Codda mówią, że RDBMS musi traktować
NULL
wartości w specjalny sposób.To, jak dokładnie to zostanie zastosowane, zależy od architektów baz danych, w zależności od faktycznej dziedziny - zadania - projektu - aplikacji - obszaru.
źródło