MySQL Integer 0 vs NULL

问题描述 投票:25回答:8

使用整数列时,最好使0NULL表示没有值。

例如,如果表中有一个parent_id字段,而某个特定条目没有父级,您会使用0还是NULL

过去我总是使用0,因为我来自Java世界,整数(必须小于1.5)必须始终具有值。

我主要是询问绩效,我不太担心哪个是“更正确的”选项。

mysql sql database performance null
8个回答
30
投票

优选使用NULL,这有两个原因:

  1. NULL用于表示该字段没有值,这正是您要建模的值。
  2. 如果将来决定添加一些参照完整性约束,则必须使用NULL

25
投票

如果可能,将列声明为NOT NULL。通过更好地使用索引并消除测试每个值是否为NULL的开销,它可以使SQL操作更快。您还节省了一些存储空间,每列一位。如果您的表中确实需要NULL值,请使用它们。只是避免使用默认设置,该默认设置允许每列中都为NULL值。

MySQL - optimizing data size


6
投票

使用NULL表示“无值”在字面上是正确的。 0是整数值,因此具有含义。NULL otoh从字面上意味着没有任何东西,因此没有价值。

性能可能无关紧要,但是如果您学习正确地使用NULL进行编码,则使用NULL可能会更快一些。


3
投票

您不应该期望由此看到任何现实生活中的表现差异


3
投票

在您的parent_id示例中,0完全有效,因为它代表'root'。在大多数情况下,从逻辑上讲,NULL是“无值”的更好选择。

不过,我对性能没有任何影响。


2
投票

[UNIQUE( id1, id2 )将不能使用空值,因为它将允许,例如两次1, null

另一方面,如果您使用0,则将执行JOIN atable ON this.extID = atable.ID连接(导致没有连接的行),而NULL将被忽略

无论如何,我建议始终使用“空值”(例如0或空字符串)而不是NULL,除非该空值与NULL的含义不同

而且我还像这样修改查询:JOIN atable ON this.extID = atable.id AND extID > 0阻止执行无用的联接


2
投票
对于整数列,

0仍然是有效值。因此,您必须使用NULL并在该列上允许null。

此外,如果仅将integer列用于正数,则可以将-1用于no值。

在您要使用parent_id0引用示例中,直到您确保没有以id 0开头的引用id都可以。


1
投票

我认为如果您实际上并不希望将0用作值,则可以使用0而不是NULL。

例如,您的列是外键。由于外键通常不是以0开头,而是以1开头,这意味着您不会期望将0用作值。

然后您可以使用0表示'否'值状态。在联接中使用它不会匹配另一个表上的任何列。因此,具有与NULL相同的效果。

但是如果您有一列,其中0实际上具有含义。例如,数量字段。除此之外,您还需要表达和空值。例如,表示尚未输入数量。然后您需要一个NULL。

希望如此。

© www.soinside.com 2019 - 2024. All rights reserved.