Ich bin neugierig zu wissen, wie NULL in einer Datenbank gespeichert werden?
Es hängt sicherlich vom Datenbankserver ab, aber ich hätte gerne eine allgemeine Vorstellung davon.
Erster Versuch:
Angenommen, der Server hat einen undefinierten Wert (könnte irgendetwas sein) in das Feld für einen NULL-Wert.
Könnten Sie sehr glücklich sein und den NULL-Wert mit
abrufen %Vor%Zweiter Versuch:
Hat der Server irgendwo ein Flag oder irgendwelche Metadaten, um anzuzeigen, dass dieses Feld NULL ist?
Dann muss der Server diese Metadaten lesen, um das Feld zu überprüfen.
Wenn die Metadaten einen NULL-Wert angeben und die Abfrage kein "field IS NULL" hat, dann wird der Datensatz ignoriert.
Es scheint zu einfach ...
In PostgreSQL wird eine optionale Bitmap mit einem Bit pro Spalte verwendet (0 ist null, 1 ist nicht null). Wenn die Bitmap nicht vorhanden ist, sind alle Spalten nicht null.
Dies ist vollständig getrennt von der Speicherung der Daten selbst, befindet sich jedoch auf der gleichen Seite wie die Zeile (so werden sowohl die Zeile als auch die Bitmap zusammen gelesen).
Referenzen:
MySql verwendet die zweite Methode. Es speichert ein Array von Bits (eins pro Spalte) mit den Daten für jede Zeile, um anzuzeigen, welche Spalten null sind und dann die Daten für dieses Feld leer lassen. Ich bin mir ziemlich sicher, dass dies auch für alle anderen Datenbanken gilt.
Das Problem mit der ersten Methode besteht darin, dass der Wert, den Sie für Ihre Daten auswählen, nicht als gültige Daten angezeigt wird. Für einige Werte (wie Datumsangaben oder Fließkommazahlen) gilt dies. Für andere (wie ganze Zahlen) ist das falsch.
Der Server verwendet normalerweise Metainformationen anstelle eines magischen Werts. Es gibt also ein bisschen aus, das angibt, ob das Feld null ist.
-Adam
IBM Informix Dynamic Server verwendet spezielle Werte, um Nullen anzuzeigen. Beispielsweise ist der gültige Wertebereich für ein SMALLINT (16-Bit, signiert) -32767 .. + 32767. Der andere Wert -32768 ist reserviert, um NULL anzugeben. Ähnlich für INTEGER (4-Byte, signiert) und BIGINT (8-Byte, signiert). Bei anderen Typen werden andere spezielle Darstellungen verwendet (z. B. alle Bits 1 für SQL FLOAT und SMALLFLOAT - bzw. C Double und Float). Dies bedeutet, dass kein zusätzlicher Speicherplatz benötigt wird.
IBM DB2 für Linux, Unix, Windows verwendet zusätzliche Bytes zum Speichern der Nullindikatoren. AFAIK, es verwendet ein separates Byte für jedes Nullable-Feld, aber ich könnte bei diesem Detail falsch liegen.
Wie bereits erwähnt, unterscheiden sich die Mechanismen je nach DBMS.
Das Problem mit speziellen Werten für NULL ist, dass früher oder später dieser spezielle Wert eingefügt wird. Beispielsweise wird es in eine Tabelle eingefügt, in der die speziellen NULL-Indikatoren für verschiedene Datenbankserver angegeben sind
%Vor%; -)