2008-10-31 11 views
8

Jestem ciekawy, jak NULL są przechowywane w bazie danych?W jaki sposób NULL są przechowywane w bazie danych?

To na pewno zależy od serwera bazy danych, ale chciałbym mieć ogólny pomysł na ten temat.


najpierw spróbować:

Załóżmy, że serwer umieścić wartość nieokreśloną (może być cokolwiek) w polu o wartości NULL.

Mógłbyś być bardzo szczęśliwy i pobrać wartość NULL z

...WHERE field = 'the undefined value (remember, could be anything...)' 

drugą szansę:

Czy serwer posiada flagę lub jakiekolwiek meta-dane gdzieś zaznaczyć to pole jest NULL ?

Następnie serwer musi odczytać te meta dane, aby zweryfikować pole.

Jeśli meta-dane wskazują wartość NULL i jeśli zapytanie nie ma "pole IS NULL", , rekord jest ignorowany.


Wydaje się zbyt proste ...

+1

Serwer ma flagę jakiegoś, a serwer odczytuje metadane do sprawdzenia pole. Tylko dlatego, że wartość ma wartość NULL, nie oznacza to, że rekord jest ignorowany - z wielu, wielu (zwykle złożonych) powodów. –

Odpowiedz

1

W PostgreSQL używa opcjonalnej bitmapy z jednym bitem na kolumnę (0 jest puste, 1 nie jest puste). Jeśli bitmapa nie jest obecna, wszystkie kolumny nie mają wartości null.

Jest to całkowicie oddzielne od przechowywania samych danych, ale znajduje się na tej samej stronie, co wiersz (więc zarówno wiersz, jak i bitmapa są odczytywane razem).

Referencje:

2

Serwer zazwyczaj używa informacji meta zamiast magiczną wartość. A więc jest trochę gdzieś, które określa, czy pole ma wartość zerową.

-Adam

9

MySql używa drugiej metody. Przechowuje on tablicę bitów (po jednej na kolumnę) z danymi dla każdego wiersza, aby wskazać, które kolumny są puste, a następnie pozostawia dane dla tego pola puste. Jestem prawie pewien, że jest tak również w przypadku wszystkich innych baz danych.

Problem z pierwszą metodą polega na tym, czy wybrana wartość danych nie będzie pokazywana jako prawidłowe dane? W przypadku niektórych wartości (takich jak daty lub liczby zmiennoprzecinkowe) jest to prawda. Dla innych (jak liczby całkowite) jest to fałsz.

1

IBM Informix Dynamic Server wykorzystuje wartości specjalnych do wskazania wartości null. Na przykład poprawny zakres wartości dla SMALLINT (16-bitowy, podpisany) to -32767 .. + 32767. Druga wartość -32768 jest zarezerwowana dla wskazania wartości NULL. Podobnie w przypadku INTEGER (4-bajtowe, podpisane) i BIGINT (8-bajtowe, podpisane). W przypadku innych typów używa innych specjalnych reprezentacji (na przykład wszystkie bity 1 dla SQL FLOAT i SMALLFLOAT - odpowiednio C podwójny i zmienny). Oznacza to, że nie musi używać dodatkowej przestrzeni.

IBM DB2 dla Linux, Unix, Windows używa dodatkowych bajtów do przechowywania wskaźników zerowych; AFAIK, używa oddzielnego bajtu dla każdego pola zerowego, ale mógłbym się mylić z tym szczegółem.

Tak więc, jak wskazano, mechanizmy różnią się w zależności od DBMS.

1

Problem ze specjalnymi wartościami wskazującymi wartość NULL jest taki, że wcześniej lub później wprowadzona zostanie wartość specjalna. Na przykład, zostanie wstawiony do tabeli z wyszczególnieniem specjalnych wskaźników NULL dla różnych serwerów baz danych

| DBServer  | SpecialValue | 
+--------------+--------------+ 
| 'Oracle'  | 'Glyph'  | 
| 'SQL Server' | 'Redmond' | 

;-)