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
Za pomocą NULL
można rozróżnić "nie wstawiaj danych" i "wstaw puste dane".
Niektóre więcej różnic:
LENGTH
zNULL
jestNULL
, ALENGTH
pusty ciąg jest0
.NULL
s są sortowane przed pustymi ciągami.COUNT(message)
będzie liczyć pustych strun, ale nieNULL
sMoż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
wmytext
, 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
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.
... 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. :-) –
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 = ''
.
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. –
'Steve B.': zobacz to pytanie: http://stackoverflow.com/questions/1171196/difference-between-varchar-and-varchar2 – Quassnoi
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 –
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.
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
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
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?
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.
- 1. Jak zwrócić pusty ciąg znaków, jeśli obiekt ma wartość NULL?
- 2. Szyfruj pusty ciąg znaków
- 3. Kiedy jest Request.Form ["name"] null i kiedy pusty ciąg znaków?
- 4. gson: Traktuj null jako pusty Ciąg
- 5. ciąg :: kasowanie (0) na pusty ciąg znaków?
- 6. Jak mogę sprawdzić zmienną C# jest pusty ciąg "" lub null?
- 7. Injection of null lub pusty ciąg jako wartość domyślna właściwości
- 8. AccountManager.getAuthToken zwraca pusty ciąg znaków, czasami
- 9. Dlaczego Cocoa zwraca czasami pusty ciąg znaków?
- 10. Jak zamienić wystąpienia "-" na pusty ciąg znaków?
- 11. Sprawdzanie, czy ciąg znaków jest pusty
- 12. JQuery val() zwraca pusty ciąg znaków
- 13. Dlaczego System.Web.HttpContext.Current.User.Identity.Name zwraca pusty ciąg znaków?
- 14. mysql_real_escape_string() właśnie tworzy pusty ciąg znaków?
- 15. Zamienianie na pusty ciąg znaków: nieoczekiwany wynik
- 16. Ustal, czy ciąg znaków jest "pusty".
- 17. Ciąg na zimno == true LUB pusty == fałsz?
- 18. Dopasowywanie wzorców w celu sprawdzenia, czy ciąg znaków jest pusty lub pusty
- 19. Android SearchView pusty ciąg
- 20. Type.GetType (typeName ciąg znaków) zwraca null
- 21. Dlaczego PowerShell inaczej traktuje pusty ciąg znaków w wierszu poleceń?
- 22. One liner bo jeśli ciąg nie jest null lub pusty inny
- 23. Zastępowanie NULL i pusty ciąg w instrukcji Select
- 24. dlaczego javascript this.style [property] zwraca pusty ciąg znaków?
- 25. Czy lepiej jest użyć DateTime.MinValue lub null daty DateTime?
- 26. JSON pusty ciąg
- 27. StreamReader.ReadToEnd() wraca pusty ciąg
- 28. Jak wstawić NULL w mysql szczególnie INT dataType
- 29. Oracle 10g: kolumna jest pusta, ale nie jest pusta lub pusty ciąg znaków
- 30. Jak sprawdzić, czy ciąg znaków jest pusty w eliksiru
ale który z nich jest szybszy? 0 lub NULL lub " –
@aadravid: bez różnicy. – Quassnoi
in InnoDB NULL zajmuje mniej miejsca –