Para las tablas MyISAM, NULL crea un bit adicional para cada columna NULLABLE (el bit nulo) para cada fila. Si la columna no es NULLABLE, nunca se necesita el bit adicional de información. Sin embargo, eso se completa con bytes de 8 bits, por lo que siempre obtiene 1 + mod 8 bytes para el recuento de columnas NULLABLE. 1
Las columnas de texto son un poco diferentes de otros tipos de datos. Primero, para "" la entrada de la tabla contiene la longitud de dos bytes de la cadena seguida de los bytes de la cadena y es una estructura de longitud variable. En el caso de NULL, no es necesaria la información de longitud, pero se incluye de todos modos como parte de la estructura de la columna.
En InnoDB, NULLS no ocupan espacio:simplemente no existen en el conjunto de datos. Lo mismo es cierto para la cadena vacía ya que las compensaciones de datos tampoco existen. La única diferencia es que los NULL tendrán el bit NULL establecido mientras que las cadenas vacías no. 2
Cuando los datos se distribuyen realmente en el disco, NULL y '' ocupan EXACTAMENTE EL MISMO ESPACIO en ambos tipos de datos. Sin embargo, cuando se busca el valor, verificar NULL es un poco más rápido que verificar '', ya que no tiene que considerar la longitud de los datos en sus cálculos:solo verifica el bit nulo.
Como resultado de las diferencias de espacio NULL y '', NULL y '' no tienen IMPACTO DE TAMAÑO a menos que se especifique que la columna sea NULLable o no. Si la columna NO es NULL, solo en las tablas MyISAM verá alguna diferencia de rendimiento (y luego, obviamente, NULL predeterminado no se puede usar, por lo que es una pregunta discutible).
La verdadera pregunta se reduce a la interpretación de la aplicación de las columnas "sin valor establecido aquí". Si "" es un valor válido que significa "el usuario no ingresó nada aquí" o algo así, entonces es preferible NULL predeterminado, ya que desea distinguir entre NULL y "" cuando se ingresa un registro que no tiene datos.
Sin embargo, en general, el valor predeterminado solo es útil para refactorizar una base de datos, cuando los nuevos valores deben entrar en vigencia en los datos antiguos. En ese caso, nuevamente, la elección depende de cómo se interpreten los datos de la aplicación. Para algunos datos antiguos, NULL es perfectamente apropiado y el mejor ajuste (la columna no existía antes, ¡así que ahora tiene un valor NULL!). Para otros, "" es más apropiado (a menudo, cuando las consultas utilizan SELECT * y NULL provoca problemas de bloqueo).
En TÉRMINOS ULTRAGENERALES (y desde un punto de vista filosófico), se prefiere NULL predeterminado para columnas NULLABLE, ya que brinda la mejor interpretación semántica de "Sin valor especificado".
1 [http://forge.mysql.com/wiki/MySQL_Internals_MyISAM]
2 [http://forge.mysql.com/wiki/MySQL_Internals_InnoDB]