MySQL:NULL vs""

Ion*_*Br. 44 mysql

在MySQL中使用default nulldefault ""用于文本字段更好吗?

为什么?

更新:我知道他们每个人的意义.我感兴趣的是考虑磁盘空间和性能更好.

更新2:嘿ppl!问题是"什么是更好用"而不是"每个意味着什么"或"如何检查它们"......

Jam*_*mes 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"的最佳语义解释.

1 [ http://forge.mysql.com/wiki/MySQL_Internals_MyISAM]

2 [ http://forge.mysql.com/wiki/MySQL_Internals_InnoDB]


Pau*_*ier 41

使用默认值null.在SQL中,null与空字符串("")非常不同.空字符串具体表示该值设置为空; null表示未设置该值,或者设置为null.你看,有不同的含义.

不同的含义及其不同的用法是为什么在适当时使用它们的重要性; 通过使用default null相对于可能节省的空间量default ""是如此之小以至于它接近于可忽略性; 但是,使用适当的默认值作为惯例的潜在价值是非常高的.

  • 在MySQL中,OP正在讨论手册推荐的NOT NULL列."如果可能的话,将列声明为NOT NULL.通过更好地使用索引并消除测试每个值是否为NULL的开销,使SQL操作更快.还可以节省一些存储空间,每列一位." http://dev.mysql.com/doc/refman/5.5/en/data-size.html (10认同)
  • 在Oracle''IS NULL中 (5认同)
  • 是的,这样你可以不同于可能有效的"空值"处理NO VALUE (2认同)

Gry*_*har 22

来自高性能MySQL,第3版

尽可能避免使用NULL. 即使应用程序不需要存储NULL(缺少值),许多表也包含可空列,仅仅因为它是默认值.除非您打算在其中存储NULL,否则通常最好将列指定为NOT NULL.MySQL更难以优化引用可空列的查询,因为它们使索引,索引统计和值比较更加复杂.可空列使用更多存储空间,并且需要在MySQL内部进行特殊处理.当索引可空列时,每个条目需要一个额外的字节,甚至可以在MyISAM中将固定大小的索引(例如单个整数列上的索引)转换为可变大小的索引.从更改NULL列到NOT NULL的性能改进通常很小,因此除非您知道它们导致问题,否则不要优先在现有模式上查找和更改它们.但是,如果您计划索引列,请尽可能避免使其可为空.当然也有例外.例如,值得一提的是InnoDB只用一个位存储NULL,因此对于稀疏填充的数据来说它可以非常节省空间.但这不适用于MyISAM.

  • 将字符串列中的所有空值转换为空字符串并使列NOT NULL*实际上*将性能提高到任何可测量的范围?出于性能原因应该避免可空列的想法是我直到现在才听说过的,我立即对此表示怀疑. (3认同)
  • 我认为确切的数字将取决于您的引擎,列类型,列/索引大小,行数等.因此,在查询某些列时会出现实际性能问题,因此您不应该这样做. (2认同)

deg*_*ate 11

我发现NULL vs""在磁盘空间和性能方面是微不足道的.

我可以亲自看到在''上使用NULL的唯一真正原因是当你有一个标记为UNIQUE但需要能够允许多个"空"列的字段时.

例如,我的用户表中的电子邮件列仅在某人实际拥有电子邮件地址时填写.没有电子邮件地址的人都会获得NULL.我仍然可以使这个字段唯一,因为NULL不算作值,而空字符串''是.


Eri*_*ric 7

很多人都在回答null和之间的区别'',但是OP要求占用的空间更少/更快,所以这是我对它的抨击:

答案是,这取决于.如果你的字段是a char(10),如果没有设置,它将总是需要10个字节null,因此null占用的空间更少.按行分钟,但超过数百万行,这可能会增加.我相信即使是一个varchar(10)将一个字节(\0)存储为一个空字符串,所以再次这可能会超过巨大的表.

在查询性能方面,null理论上更快速地进行测试,但我还没有看到能够在索引良好的表上提出任何明显的差异.但请记住,如果这是期望的回报,您可能必须转换null''应用程序端.同样,逐行,差异很小,但它可能会加起来.

总而言之,这是一种微观优化,因此归结为偏好.我的偏好是使用null因为我想知道那里没有值,而不是猜测它是一个空字符串('')还是一堆空格(' ').null本质上是明确的.''不是.因此,我选择null因为我是一个明确的人.