2009-08-12 19 views
202

Mam formularz na stronie internetowej, która ma wiele różnych dziedzin. Niektóre pola są opcjonalne, a niektóre są obowiązkowe. W moim DB mam tabelę, która przechowuje wszystkie te wartości, czy lepiej jest wstawić wartość NULL lub pusty ciąg do kolumn DB, gdzie użytkownik nie umieścić żadnych danych?MySQL, lepiej wstawić NULL lub pusty ciąg znaków?

Odpowiedz

203

Za pomocą NULL można rozróżnić "nie wstawiaj danych" i "wstaw puste dane".

Niektóre więcej różnic:

  • LENGTH z NULL jest NULL, A LENGTH pusty ciąg jest 0.

  • NULL s są sortowane przed pustymi ciągami.

  • COUNT(message) będzie liczyć pustych strun, ale nie NULL s

  • Można wyszukiwać pusty ciąg użyciu zmiennej związanej ale nie dla NULL. To zapytanie:

    SELECT * 
    FROM mytable 
    WHERE mytext = ? 
    

    nigdy nie dopasuje NULL w mytext, niezależnie od wartości przechodzą od klienta. Aby dopasować NULL s, będziesz musiał użyć innego zapytania:

    SELECT * 
    FROM mytable 
    WHERE mytext IS NULL 
    
+1

ale który z nich jest szybszy? 0 lub NULL lub " –

+3

@aadravid: bez różnicy. – Quassnoi

+7

in InnoDB NULL zajmuje mniej miejsca –

3

ja nie wiem, co najlepsze praktyki byłoby tutaj, ale ja generalnie naruszył rzecz null, chyba że chcesz zerowy oznacza coś innego niż ciąg pusty, a dane wejściowe użytkownika odpowiadają definicji pustego łańcucha.

Zauważ, że mówię, że musisz zdefiniować, w jaki sposób chcesz, aby były inne. Czasami ma to sens, aby je odróżnić, czasem nie. Jeśli nie, po prostu wybierz jedną i trzymaj się jej. Tak jak powiedziałem, zwykle preferuję NULL.

Aha, i pamiętaj, że jeśli kolumna ma wartość null, rekord jest mniej prawdopodobne, aby pojawić się w praktycznie każdym zapytaniu, które wybiera (ma klauzuli where, w terminach SQL) w oparciu od tej kolumny, chyba że wybór jest oczywiście dla kolumny zerowej.

+0

... A teraz, gdy widzę odpowiedź nade mną, myślę, że można bezpiecznie powiedzieć, że zwykłe zróżnicowanie, na którym ci zależy, to brak danych a puste dane. :-) –

38

Jedna rzecz do rozważenia, jeśli kiedykolwiek plan przełączania baz danych, jest to Oracle does not support empty strings. Są automatycznie konwertowane na NULL i nie można ich wyszukać za pomocą klauzul takich jak WHERE somefield = ''.

+11

To brzmiało niewiarygodnie dla mnie, nawet na twoim łączu, więc spróbowałem. Pole puste, ustawione na '', wyrocznia ignoruje je. Raportuje długość jako wartość zerową zamiast 0. To po prostu nie tak. Musi być jakoś obejść to. Pomyśl, że opublikuję to jako kolejne pytanie. –

+1

'Steve B.': zobacz to pytanie: http://stackoverflow.com/questions/1171196/difference-between-varchar-and-varchar2 – Quassnoi

+0

Dzięki za referencje, chociaż nadal nie rozumiem uzasadnienia. Wysłany jako http://stackoverflow.com/questions/1268177/oracle-not-distinguishing-between-nulls-and-empty-strings –

7

Jedną z rzeczy, o których warto pamiętać, jest to, że NULL może znacznie utrudnić twoje ścieżki kodowe. W Pythonie na przykład większość adapterów baz danych/ORM mapuje NULL na None.

więc takie rzeczy jak: "Witaj, żaden Joe Doe"

print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow 

może spowodować Aby tego uniknąć, potrzebujesz czegoś takiego, jak ten kod:

if databaserow.title: 
    print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow 
else: 
    print "Hello, %(firstname) %(lastname)!" % databaserow 

Co może sprawić, że rzeczy będą bardziej skomplikowane.

+22

Moim zdaniem nadużywanie bazy danych w celu "naprawienia" błędów w kodzie lub strukturze jest (bardzo) złą praktyką kodowania. Kiedy nie ma danych, powinieneś wstawić NULL i konsekwentnie używać tego. W przeciwnym razie musisz używać instrukcji takich jak: if (myString == null || myString = ""). Kiedy obiekt nie jest ustawiony lub zdefiniowany w twoim kodzie, używasz także NULL zamiast jakiegoś "placeholder" (który według mnie jest pusty). – Gertjan

+5

W dużym stopniu zależy od wybranego przez Ciebie języka. W Pythonie "jeśli nie myString:" testy dla Brak i "". Prawdopodobnie są to głównie problemy kulturowe. "Zła praktyka" w języku Java Guys to elegancja dynamicznej osoby. – max

5

Lepiej wstawić NULL dla spójności bazy danych w MySQL. Klucze obce można zapisać jako NULL, ale NIE jako puste ciągi.

Będziesz mieć problemy z pusty ciąg znaków w wiązaniach. Może być konieczne wstawienie fałszywego rekordu z unikalnym pustym ciągiem , aby spełnić ograniczenie klucza obcego. Zła praktyka, jak sądzę.

Zobacz także: Can a foreign key be NULL and/or duplicate?

-1

nie wiem o wydajności. Ale pod względem jakości danych, zerowa jest zła.

Null podaje typ maybe, który zmusza do napisania testu typu działania, takiego jak: something = a.b.c.d.something if exist?(a) && exist?(a.b) && exist?(a.b.c) && exist?(a.b.c.d) && exist?(a.b.c.d.something).

Ten problem może zostać złagodzony, jeśli nie używasz formatów json/hash/array.

Ale tak, letting null exist is a billion dollar mistake.

Powiązane problemy