Для таблиц MyISAM NULL создает дополнительный бит для каждого столбца NULLABLE (нулевой бит) для каждой строки. Если столбец не NULLABLE, дополнительный бит информации никогда не требуется. Однако это дополняется до 8 битных байтов, поэтому вы всегда получаете 1 + мод 8 байтов для количества столбцов NULLABLE. 1
Текстовые столбцы немного отличаются от других типов данных. Во-первых, для "" запись таблицы содержит двухбайтовую длину строки, за которой следуют байты строки, и представляет собой структуру длины варианта. В случае NULL информация о длине не требуется, но она в любом случае включена как часть структуры столбца.
В InnoDB NULLS не занимают места: они просто не существуют в наборе данных. То же самое верно для пустой строки, поскольку смещения данных также не существуют. Единственное отличие состоит в том, что для значений NULL будет установлен бит NULL, а для пустых строк - нет. 2
Когда данные на самом деле располагаются на диске, NULL и '' занимают ровно то же самое пространство в обоих типах данных. Однако при поиске значения проверка NULL выполняется немного быстрее, чем проверка '', поскольку вам не нужно учитывать длину данных в своих вычислениях: вы проверяете только нулевой бит.
В результате различий между NULL и '', NULL и '' НЕ ВЛИЯЮТ НА РАЗМЕР, если в столбце не указано NULLable или нет. Если столбец НЕ ПУСТО (NULL), то только в таблицах MyISAM вы увидите разницу в производительности (и тогда, очевидно, значение по умолчанию NULL не может быть использовано, поэтому это спорный вопрос).
Реальный вопрос сводится к интерпретации приложением столбцов «здесь не задано значение». Если "" является допустимым значением, означающим "пользователь здесь ничего не ввел" или что-то подобное, то предпочтительным является значение по умолчанию NULL, поскольку вы хотите различать NULL и "" при вводе записи, в которой нет данных.
Обычно, по умолчанию, действительно полезно только для рефакторинга базы данных, когда новые значения должны вступать в силу для старых данных. В этом случае, опять же, выбор зависит от того, как интерпретируются данные приложения. Для некоторых старых данных NULL идеально подходит и лучше всего подходит (столбец ранее не существовал, поэтому теперь он имеет значение NULL!). Для других «» более подходит (часто, когда запросы используют SELECT *, а NULL вызывает проблемы сбоев).
В ULTRA-GENERAL TERMS (и с философской точки зрения) значение NULL по умолчанию для столбцов NULLABLE является предпочтительным, поскольку оно дает наилучшую семантическую интерпретацию «Не указано значение».
1 [http://forge.mysql.com/wiki/MySQL_Internals_MyISAM]
2 [http://forge.mysql.com/wiki/MySQL_Internals_InnoDB]