Beachten Sie die folgenden Informationen, die von Microsoft SQL-Dokumentenseiten stammen:
Das SQL Server-Datenbankmodul optimiert die Speicherung von Bitspalten. Wenn eine Tabelle 8 oder weniger Bitspalten enthält, werden die Spalten als 1 Byte gespeichert. Wenn 9 bis 16-Bit-Spalten vorhanden sind, werden die Spalten als 2 Byte usw. gespeichert.
Siehe: https://docs.microsoft.com/en-us/sql/t-sql/data-types/bit-transact-sql?view=sql-server-2017
Wenn ich also eine neue Tabelle wie diese erstelle:
CREATE TABLE MyTable (
Id int PRIMARY KEY,
Value1 bit,
Value2 bit,
Value3 bit,
Value4 bit,
Value5 bit,
Value6 bit,
Value7 bit,
Value8 bit)
... dann sollten alle Bitspalten (Wert1, Wert2, ... Wert8) in einer Zeile ein Byte einnehmen. Oder?
Bei näherer Betrachtung kann das Feld Wert1 einer Zeile die Werte 0, 1 oder NULL enthalten. Dies bedeutet, dass das Feld tatsächlich einen Wert mit drei Zuständen oder einen ternären Wert hat. 2 solche Werte können ein Wörterbuch mit 3 * 3 = 9 Werten darstellen. 8 solche Werte sind ein Wörterbuch mit 6561 Werten.
Wenn wir über den Speicherbedarf einer solchen Zeile nachdenken, sollten 8 Bits ein Byte einnehmen. Dies bedeutet, dass dieses eine Byte 6561 Werte anstelle von 256 Werten codiert. Das ist offensichtlich falsch.
Entweder sind MS SQL-Dokumente irreführend, oder wir sprechen hier von Quantencomputern. Natürlich ist es das erstere, aber was ich wirklich wissen möchte, ist die Antwort auf diese Frage: Wie werden nullbare Bits (und natürlich, dass SQL Server-Bits standardmäßig nullbar sind) wirklich in zugrunde liegenden SQL Server-Strukturen gespeichert?