James..
54
对于MyISAM表,NULL为每行的每个NULLABLE列(空位)创建一个额外的位.如果列不是NULLABLE,则永远不需要额外的信息.但是,它被填充为8位字节,因此对于NULLABLE列的计数,您总是获得1 + mod 8字节.1
文本列与其他数据类型略有不同.首先,对于"",表条目保存字符串的两个字节长度,后跟字符串的字节,并且是变量长度结构.在NULL的情况下,不需要长度信息,但它仍然作为列结构的一部分包含在内.
在InnoDB中,NULLS不占用空间:它们根本不存在于数据集中.对于空字符串也是如此,因为数据偏移也不存在.唯一的区别是NULL将设置NULL位,而空字符串不会.2
当数据实际布局在磁盘上时,NULL和''在两种数据类型中完全占用相同的空间.但是,当搜索该值时,检查NULL会比检查''稍微快一些,因为您不必考虑计算中的数据长度:您只检查空位.
由于NULL和''空格不同,NULL和''没有SIZE IMPACT,除非指定列是否为NULL.如果列是非NULL,只有在MyISAM表中才会看到任何性能差异(然后,显然,不能使用默认的NULL,因此这是一个没有实际意义的问题).
真正的问题归结为"没有设置值"列的应用解释.如果""是一个有效值,意思是"用户在此处输入任何内容"或某些内容,则默认为NULL,因为您希望在输入没有数据的记录时区分NULL和"".
通常,默认实际上只对重构数据库有用,因为新值需要对旧数据生效.在这种情况下,再次,选择取决于如何解释应用程序数据.对于某些旧数据,NULL非常合适且最适合(列之前不存在,因此它现在具有NULL值!).对于其他人来说,""更合适(通常在查询使用SELECT*和NULL时会导致崩溃问题).
在ULTRA-GENERAL TERMS中(以及从哲学角度来看)NULLABLE列的默认NULL是首选,因为它提供了"No Value Specified"的最佳语义解释.