За таблици MyISAM, NULL създава допълнителен бит за всяка колона NULLABLE (нулевият бит) за всеки ред. Ако колоната не е NULLABLE, допълнителният бит информация никога не е необходим. Това обаче е подплатено до 8 битови байта, така че винаги получавате 1 + mod 8 байта за броя на колоните NULLABLE. 1
Текстовите колони са малко по-различни от другите типове данни. Първо, за "" записът в таблицата съдържа дължината от два байта на низа, последвани от байтовете на низа и е структура с вариантна дължина. В случай на NULL няма нужда от информация за дължината, но тя все пак е включена като част от структурата на колоните.
В InnoDB NULLS не заемат място:те просто не съществуват в набора от данни. Същото важи и за празния низ, тъй като отместванията на данните също не съществуват. Единствената разлика е, че NULL ще имат зададен бит NULL, докато празните низове нямат. 2
Когато данните действително са изложени на диск, NULL и '' заемат ТОЧНО СЪЩОТО МЯСТО и в двата типа данни. Въпреки това, когато стойността се търси, проверката за NULL е малко по-бърза от проверката за '', тъй като не е нужно да вземете предвид дължината на данните при изчисленията си:проверявате само нулевия бит.
В резултат на разликите в NULL и '' пространството, NULL и '' нямат ВЛИЯНИЕ НА РАЗМЕРА, освен ако колоната не е посочена като NULL или не. Ако колоната НЕ е NULL, само в таблиците MyISAM ще видите някаква разлика в производителността (и тогава, очевидно, NULL по подразбиране не може да се използва, така че това е спорен въпрос).
Истинският въпрос след това се свежда до интерпретацията на приложението на колоните "не е зададена стойност тук". Ако "" е валидна стойност, което означава "потребителят не е въвел нищо тук" или нещо подобно, тогава NULL по подразбиране е за предпочитане, тъй като искате да правите разлика между NULL и "", когато е въведен запис, който няма данни в него.
Като цяло обаче по подразбиране е полезно само за рефакторинг на база данни, когато трябва да влязат в сила нови стойности върху стари данни. В този случай, отново, изборът зависи от това как се интерпретират данните от приложението. За някои стари данни NULL е напълно подходящо и най-добре пасва (колоната не е съществувала преди, така че сега има стойност NULL!). За други "" е по-подходящо (често когато заявките използват SELECT * и NULL причиняват проблеми със срив).
В УЛТРА-ОБЩИ ТЕРМИНИ (и от философска гледна точка) се предпочита NULL по подразбиране за NULLABLE колони, тъй като дава най-добрата семантична интерпретация на „Няма посочена стойност“.
1 [http://forge.mysql.com/wiki/MySQL_Internals_MyISAM]
2 [http://forge.mysql.com/wiki/MySQL_Internals_InnoDB]