Ich interessiere mich hauptsächlich für MySQL und PostgreSQL, aber Sie könnten im Allgemeinen Folgendes beantworten:
- Gibt es ein logisches Szenario, in dem es nützlich wäre, eine leere Zeichenfolge von NULL zu unterscheiden?
Welche Auswirkungen hätte der physische Speicher auf das Speichern einer leeren Zeichenfolge als ...
- NULL?
- Leerer String?
- Ein anderes Feld?
- Irgendwie anders?
quelle
NULL
oder nichtIch weiß nichts über MySQL und PostgreSQL, aber lassen Sie mich das etwas allgemein behandeln.
Es gibt ein DBMS, nämlich Oracle, bei dem die Benutzer nicht zwischen NULL und '' ausgewählt werden können. Dies zeigt deutlich, dass nicht zwischen beiden unterschieden werden muss. Es gibt einige ärgerliche Konsequenzen:
Sie setzen ein varchar2 auf eine leere Zeichenfolge wie folgt:
Das Folgende führt zum gleichen Ergebnis
Um jedoch die Spalten auszuwählen, in denen der Wert leer oder NULL ist, müssen Sie verwenden
Verwenden
ist syntaktisch korrekt, gibt aber niemals eine Zeile zurück.
Auf der anderen Seite, wenn Sie Zeichenfolgen in Oracle verketten. NULL-Varchars werden als leere Zeichenfolgen behandelt.
ergibt abc . Andere DBMS würden in diesen Fällen NULL zurückgeben.
Wenn Sie explizit ausdrücken möchten, dass ein Wert zugewiesen ist, müssen Sie so etwas wie "" verwenden.
Und Sie müssen sich Sorgen machen, ob das Zuschneiden nicht zu NULL führt
Es tut.
Betrachtet man nun DBMS, bei dem '' nicht mit NULL identisch ist (zB SQL-Server)
Die Arbeit mit '' ist im Allgemeinen einfacher und in den meisten Fällen besteht keine praktische Notwendigkeit, zwischen beiden zu unterscheiden. Eine der Ausnahmen, die ich kenne, ist, wenn Ihre Spalte eine Einstellung darstellt und Sie keine leeren Standardeinstellungen für sie haben. Wenn Sie zwischen '' und NULL unterscheiden können, können Sie ausdrücken, dass Ihre Einstellung leer ist, und vermeiden, dass die Standardeinstellung angewendet wird.
quelle
Dies hängt von der Domain ab, an der Sie arbeiten.
NULL
bedeutet, dass kein Wert vorhanden ist (dh es gibt keinen Wert ), während leere Zeichenfolge bedeutet, dass ein Zeichenfolgenwert mit der Länge Null vorhanden ist.Angenommen, Sie haben eine Tabelle zum Speichern der Daten einer Person und sie enthält eine
Gender
Spalte. Sie können die Werte als 'Männlich' oder 'Weiblich' speichern. Wenn der Benutzer auswählen kann, dass die Geschlechtsdaten nicht angegeben werden sollen, sollten Sie diese alsNULL
(dh Benutzer hat den Wert nicht angegeben) und nicht als leere Zeichenfolge speichern (da es kein Geschlecht mit dem Wert '' gibt).quelle
Beachten Sie, dass Sie leere Werte als NULL speichern müssen, wenn Sie ein Feld haben, das nicht erforderlich ist, aber alle vorhandenen Werte eindeutig sein müssen. Andernfalls können Sie nur ein Tupel mit einem leeren Wert in diesem Feld haben.
Es gibt auch einige Unterschiede zur relationalen Algebra und zu NULL-Werten: NULL! = NULL, zum Beispiel.
quelle
UNIQUE
Einschränkung. Glücklicherweise können Sie ab 2008 einen gefilterten Index verwenden, um das richtige Verhalten zu erzielen.Sie können auch Dates Kritik an NULL und die Probleme von 3VL in SQL und in der relationalen Theorie berücksichtigen (und Rubinsons Kritik an Dates Kritik, Nullen, dreiwertiger Logik und Ambiguität in SQL: Kritik an Dates Kritik ).
Auf beide wird in einem verwandten SO-Thread ausführlich verwiesen und eingegangen. Optionen zum Entfernen von NULL-fähigen Spalten aus einem DB-Modell .
quelle
Ein neuer Gedanke, ein großer Einfluss auf Ihre Wahl von
NULL
/NOT NULL
ist, wenn Sie ein Framework verwenden. Ich verwende viel Symfony und die Verwendung von ErlaubnisfeldernNULL
vereinfacht einige der Code- und Datenprüfungen bei der Bearbeitung der Daten.Wenn Sie kein Framework verwenden oder einfache SQL-Anweisungen und -Verarbeitungen verwenden, würde ich mich für die Wahl entscheiden, die Sie für einfacher halten, den Überblick zu behalten. Ich bevorzuge im Allgemeinen NULL, damit es bei der
INSERT
Ausführung von Anweisungen nicht langweilig wird, die leeren Felder auf zu setzenNULL
.quelle
Nachdem ich mit Oracle arbeiten musste ( was keine Unterscheidung zulässt ), bin ich zu folgendem Schluss gekommen:
Aus einem logischen POV ist es egal. Ich kann mir wirklich kein überzeugendes Beispiel vorstellen, bei dem die Unterscheidung zwischen NULL und einem String mit der Länge Null dem DBMS einen Wert hinzufügt.
Hieraus folgt: Sie haben entweder eine
NULL
Spalte, in der Nullen nicht zulässig sind''
(Oracle-ish-Lösung), oder eineNOT NULL
Spalte, in der Nullen zulässig sind.Und meiner Erfahrung nach
''
ist es viel sinnvoller, wenn Sie die Daten verarbeiten, da Sie normalerweise das Fehlen einer Zeichenfolge als leere Zeichenfolge verarbeiten möchten: Verkettung, Vergleich usw.Hinweis: So kehren Sie zu meiner Oracle-Erfahrung zurück: Angenommen, Sie möchten eine Abfrage für eine Suchanfrage generieren. Wenn Sie verwenden
''
, können Sie nur generierenWHERE columnX = <searchvalue>
und es wird für die Suche nach Gleichheit funktionieren. Wenn Sie verwendenNULL
, müssen Sie tunWHERE columnX=<searchvalue> or (columnX is NULL and serchvalue is NULL)
. Bah! :-)quelle
Sie unterscheiden sich auch aus gestalterischer Sicht:
z.B
Sieht aus wie:
Lass uns ein paar Daten einfügen:
Versuchen wir es jetzt mit null:
Das ist erlaubt.
Soooooo: Nullen sind weder triviale Zeichenfolgen noch das Gegenteil.
Prost
quelle
Wenn wir über Theorie sprechen, dann besagen die Codd-Regeln, dass RDBMS
NULL
Werte auf besondere Weise behandeln muss .Wie genau das verwendet wird, hängt von den Datenbankarchitekten ab, abhängig vom tatsächlichen Gebiet - Aufgabe - Projekt - Anwendungsbereich.
quelle