MySQL Integer 0 vs NULL

时间:2011-02-16 11:44:21

标签: mysql sql database performance null

使用整数列时,最好使用0或NULL来表示没有值。例如,如果表具有parent_id字段且特定条目没有父项,则使用0或NULL。我过去总是使用0,这是因为我来自Java世界,其中(1.5之前)整数总是必须有一个值。我主要是关于性能问题,我不太担心哪个是“更正确”的选项。

8 个答案:

答案 0 :(得分:26)

最好使用NULL,原因有两个:

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

答案 1 :(得分:23)

  

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

MySQL - optimizing data size

答案 2 :(得分:6)

使用NULL表示"没有值"确实是对的。 0是整数的值,因此它具有含义。 NULL otoh字面意思是什么都没有,所以没有价值。

性能可能无关紧要,但如果你学会正确使用NULL编码,那么使用NULL可能会更快一些。

答案 3 :(得分:3)

您不应期望看到与此

的任何真实性能差异

答案 4 :(得分:2)

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

虽然它没有我所知道的性能影响。

答案 5 :(得分: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这样的查询,这会阻止执行无用的连接

答案 6 :(得分:1)

0仍然是整数列的有效值。因此,您必须使用NULL并在该列上允许null。此外,如果仅使用整数列作为正数,则可以使用-1表示无值。

在使用0的parent_id引用的示例中,在确保没有以id 0开头的引用ID之前一切正常。

答案 7 :(得分:1)

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

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

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

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

希望这是有道理的。