W przypadku tabel MyISAM NULL tworzy dodatkowy bit dla każdej kolumny NULLABLE (bit null) dla każdego wiersza. Jeśli kolumna nie ma wartości NULLABLE, dodatkowy bit informacji nigdy nie jest potrzebny. Jednak jest to dopełniane do 8-bitowych bajtów, więc zawsze zyskujesz 1 + mod 8 bajtów na liczbę kolumn NULLABLE. 1
Kolumny tekstowe różnią się nieco od innych typów danych. Po pierwsze, dla „” wpis tabeli zawiera długość ciągu dwóch bajtów, po której następują bajty ciągu i jest strukturą o różnej długości. W przypadku wartości NULL nie ma potrzeby podawania informacji o długości, ale i tak jest ona zawarta w strukturze kolumny.
W InnoDB NULLS nie zajmują miejsca:po prostu nie istnieją w zestawie danych. To samo dotyczy pustego ciągu, ponieważ przesunięcia danych również nie istnieją. Jedyną różnicą jest to, że wartości NULL będą miały ustawiony bit NULL, podczas gdy puste łańcuchy nie. 2
Kiedy dane są faktycznie umieszczone na dysku, NULL i '' zajmują DOKŁADNIE TĄ SAMĄ MIEJSCE w obu typach danych. Jednak podczas wyszukiwania wartości sprawdzanie NULL jest nieco szybsze niż sprawdzanie '', ponieważ nie musisz brać pod uwagę długości danych w swoich obliczeniach:sprawdzasz tylko bit null.
W wyniku różnic spacji NULL i „” NULL i '' nie mają WPŁYWU NA ROZMIAR, chyba że kolumna jest określona jako dopuszczalna NULL lub nie. Jeśli kolumna NIE JEST NULL, tylko w tabelach MyISAM zobaczysz jakiekolwiek różnice w wydajności (i wtedy oczywiście nie można użyć domyślnej wartości NULL, więc jest to kwestia dyskusyjna).
Prawdziwe pytanie sprowadza się zatem do interpretacji zastosowania kolumn „nie ma tu wartości”. Jeśli „” jest prawidłową wartością oznaczającą „użytkownik nic tu nie wprowadził” lub coś w tym rodzaju, preferowane jest domyślne NULL, ponieważ chcesz rozróżnić między NULL i „”, gdy wprowadzany jest rekord, który nie zawiera żadnych danych.
Ogólnie jednak ustawienie domyślne jest przydatne tylko w przypadku refaktoryzacji bazy danych, gdy nowe wartości muszą zostać wprowadzone w życie na starych danych. W takim przypadku wybór ponownie zależy od tego, jak interpretowane są dane aplikacji. W przypadku niektórych starych danych NULL jest całkowicie odpowiedni i najlepiej dopasowany (kolumna wcześniej nie istniała, więc teraz ma wartość NULL!). W przypadku innych bardziej odpowiednie jest „” (często, gdy zapytania używają SELECT * i NULL powoduje problemy z awarią).
W ULTRA-OGÓLNYCH WARUNKACH (i z filozoficznego punktu widzenia) domyślna wartość NULL dla kolumn NULLABLE jest preferowana, ponieważ daje najlepszą semantyczną interpretację „Brak określonej wartości”.
1 [http://forge.mysql.com/wiki/MySQL_Internals_MyISAM]
2 [http://forge.mysql.com/wiki/MySQL_Internals_InnoDB]