Per le tabelle MyISAM, NULL crea un bit aggiuntivo per ogni colonna NULLABLE (il bit null) per ogni riga. Se la colonna non è NULLABLE, il bit aggiuntivo di informazioni non è mai necessario. Tuttavia, viene riempito a 8 bit byte, quindi guadagni sempre 1 + mod 8 byte per il conteggio delle colonne NULLABLE. 1
Le colonne di testo sono leggermente diverse da altri tipi di dati. Innanzitutto, per "" la voce della tabella contiene la lunghezza di due byte della stringa seguita dai byte della stringa ed è una struttura di lunghezza variante. Nel caso di NULL, le informazioni sulla lunghezza non sono necessarie ma sono comunque incluse come parte della struttura della colonna.
In InnoDB, NULLS non occupa spazio:semplicemente non esistono nel set di dati. Lo stesso vale per la stringa vuota poiché nemmeno gli offset dei dati esistono. L'unica differenza è che i NULL avranno il bit NULL impostato mentre le stringhe vuote no. 2
Quando i dati sono effettivamente disposti su disco, NULL e '' occupano ESATTAMENTE LO STESSO SPAZIO in entrambi i tipi di dati. Tuttavia, quando viene cercato il valore, il controllo di NULL è leggermente più veloce del controllo di '' poiché non devi considerare la lunghezza dei dati nei tuoi calcoli:controlli solo il bit nullo.
Come risultato delle differenze di spazio NULL e '', NULL e '' non hanno NESSUN IMPATTO DIMENSIONE a meno che la colonna non sia specificata come NULLable o meno. Se la colonna NON è NULL, solo nelle tabelle MyISAM vedrai qualsiasi differenza di prestazioni (e quindi, ovviamente, non è possibile utilizzare NULL predefinito, quindi è una domanda discutibile).
La vera domanda si riduce quindi all'interpretazione dell'applicazione delle colonne "nessun valore impostato qui". Se "" è un valore valido che significa "l'utente non ha inserito nulla qui" o qualcosa del genere, è preferibile NULL predefinito poiché si desidera distinguere tra NULL e "" quando viene inserito un record che non contiene dati.
In genere, tuttavia, l'impostazione predefinita è davvero utile solo per il refactoring di un database, quando è necessario che nuovi valori abbiano effetto sui vecchi dati. In tal caso, ancora una volta, la scelta dipende da come vengono interpretati i dati dell'applicazione. Per alcuni vecchi dati, NULL è perfettamente appropriato e la soluzione migliore (la colonna non esisteva prima, quindi ora ha un valore NULL!). Per altri, "" è più appropriato (spesso quando le query utilizzano SELECT * e NULL causa problemi di arresto anomalo).
In TERMINI ULTRA-GENERALI (e da un punto di vista filosofico) viene preferito il valore NULL predefinito per le colonne NULLABLE in quanto fornisce la migliore interpretazione semantica di "Nessun valore specificato".
1 [http://forge.mysql.com/wiki/MySQL_Internals_MyISAM]
2 [http://forge.mysql.com/wiki/MySQL_Internals_InnoDB]