MyISAMテーブルの場合、NULLは、各行のNULLABLE列ごとに追加のビット(NULLビット)を作成します。列がNULL可能でない場合、追加の情報は必要ありません。ただし、これは8ビットバイトにパディングされるため、NULL可能列のカウントに対して常に1 +mod8バイトを取得します。 1
テキスト列は、他のデータ型とは少し異なります。まず、 ""の場合、テーブルエントリは文字列の2バイト長とそれに続く文字列のバイトを保持し、バリアント長構造です。 NULLの場合、長さ情報は必要ありませんが、とにかく列構造の一部として含まれています。
InnoDBでは、NULLSはスペースを取りません。NULLSはデータセットに存在しないだけです。データオフセットも存在しないため、空の文字列についても同じことが言えます。唯一の違いは、NULLにはNULLビットが設定されますが、空の文字列には設定されないことです。 2
データが実際にディスクに配置されると、NULLと''は両方のデータ型でまったく同じスペースを占めます。ただし、値を検索する場合、計算でデータ長を考慮する必要がないため、NULLのチェックは''のチェックよりもわずかに高速です。ヌルビットのみをチェックします。
NULLと''のスペースの違いの結果として、 NULL および'' 列がNULL可能であるかどうかが指定されていない限り、サイズへの影響はありません。列がNULLでない場合、MyISAMテーブルでのみパフォーマンスの違いが見られます(そして、明らかに、デフォルトのNULLは使用できないため、議論の余地のある質問です)。
本当の問題は、「ここに値が設定されていない」列のアプリケーション解釈に要約されます。 「」が「ユーザーがここに何も入力しなかった」などを意味する有効な値である場合、データが含まれていないレコードが入力されたときにNULLと「」を区別するためにデフォルトのNULLが推奨されます。
ただし、一般的に、デフォルトは、古いデータに新しい値を有効にする必要がある場合に、データベースをリファクタリングする場合にのみ実際に役立ちます。その場合も、選択はアプリケーションデータの解釈方法によって異なります。一部の古いデータの場合、NULLが完全に適切であり、最適です(列は以前は存在しなかったため、現在はNULL値になっています!)。その他の場合は、「」の方が適切です(多くの場合、クエリでSELECT *を使用し、NULLを使用するとクラッシュの問題が発生します)。
ULTRA-GENERAL TERMS(および哲学的観点から)では、「値が指定されていません」の最良の意味解釈を提供するため、NULL可能列にはデフォルトのNULLが推奨されます。
1 [ http://forge.mysql.com/wiki/MySQL_Internals_MyISAM]
2 [ http://forge.mysql.com/wiki/MySQL_Internals_InnoDB]