Pour les tables MyISAM, NULL crée un bit supplémentaire pour chaque colonne NULLABLE (le bit nul) pour chaque ligne. Si la colonne n'est pas NULLABLE, l'information supplémentaire n'est jamais nécessaire. Cependant, cela est complété à 8 octets de sorte que vous gagnez toujours 1 + mod 8 octets pour le nombre de colonnes NULLABLE. 1
Les colonnes de texte sont un peu différentes des autres types de données. Tout d'abord, pour "", l'entrée de table contient la longueur de deux octets de la chaîne suivie des octets de la chaîne et est une structure de longueur variable. Dans le cas de NULL, les informations de longueur ne sont pas nécessaires, mais elles sont quand même incluses dans la structure de la colonne.
Dans InnoDB, les NULLS ne prennent pas de place :ils n'existent tout simplement pas dans l'ensemble de données. Il en va de même pour la chaîne vide car les décalages de données n'existent pas non plus. La seule différence est que les NULL auront le bit NULL défini alors que les chaînes vides ne le seront pas. 2
Lorsque les données sont réellement disposées sur le disque, NULL et '' occupent EXACTEMENT LE MÊME ESPACE dans les deux types de données. Cependant, lorsque la valeur est recherchée, la vérification de NULL est légèrement plus rapide que la vérification de '' car vous n'avez pas à prendre en compte la longueur des données dans vos calculs :vous ne vérifiez que le bit nul.
En raison des différences d'espace NULL et '', NULL et '' n'ont AUCUN IMPACT DE TAILLE sauf si la colonne est spécifiée comme NULLable ou non. Si la colonne n'est PAS NULL, seules les tables MyISAM verront une différence de performance (et alors, évidemment, la valeur NULL par défaut ne peut pas être utilisée, c'est donc une question sans intérêt).
La vraie question se résume alors à l'interprétation de l'application des colonnes "aucune valeur définie ici". Si le "" est une valeur valide signifiant "l'utilisateur n'a rien entré ici" ou quelque chose comme ça, alors NULL par défaut est préférable car vous voulez faire la distinction entre NULL et "" lorsqu'un enregistrement est entré sans données.
En règle générale cependant, default n'est vraiment utile que pour refactoriser une base de données, lorsque de nouvelles valeurs doivent entrer en vigueur sur d'anciennes données. Dans ce cas, encore une fois, le choix dépend de la façon dont les données d'application sont interprétées. Pour certaines anciennes données, NULL est parfaitement approprié et le meilleur ajustement (la colonne n'existait pas auparavant, elle a donc la valeur NULL maintenant !). Pour d'autres, "" est plus approprié (souvent lorsque les requêtes utilisent SELECT * et NULL provoquent des problèmes de plantage).
Dans les TERMES ULTRA-GENERAUX (et d'un point de vue philosophique), la valeur par défaut NULL pour les colonnes NULLABLE est préférée car elle donne la meilleure interprétation sémantique de "Aucune valeur spécifiée".
1 [http://forge.mysql.com/wiki/MySQL_Internals_MyISAM]
2 [http://forge.mysql.com/wiki/MySQL_Internals_InnoDB]