【问题标题】:MySQL Integer 0 vs NULLMySQL 整数 0 与 NULL
【发布时间】:2011-02-16 11:44:20
【问题描述】:

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

例如,如果一个表有一个parent_id 字段并且一个特定条目没有父项,您会使用0 还是NULL

我过去总是使用0,因为我来自 Java 世界(在 1.5 之前)整数总是必须有一个值。

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

【问题讨论】:

  • 如果您不担心哪个“更正确”,那么只需从调用数据库的报告或应用程序中输出一个硬编码的零;这将比使用任何数据库快得多。
  • 是的,这是一个有点荒谬的问题——“我不在乎我的数据是否错误,只是它很快就能判断对错”。数字零与没有值是不同的概念,这就是为什么 null 和零都是整数可能的 2 个不同值,请使用正确的值。

标签: mysql sql database performance null


【解决方案1】:

最好使用NULL,原因有二:

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

【讨论】:

    【解决方案2】:

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

    MySQL - optimizing data size

    【讨论】:

    • +1。我仍然认为“此列可能没有价值”是使用NULL 的充分理由。在违背常识之前,我想在有和没有的情况下进行基准测试。这句话只是在谈论你真的,实际上永远不会以这种方式使用它的列,AFAICT。
    【解决方案3】:

    使用 NULL 表示“无价值”在字面上是正确的。 0 是整数的值,因此它有意义。 NULL otoh 字面意思是什么都没有,所以没有价值。

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

    【讨论】:

      【解决方案4】:

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

      不过,据我所知,它对性能没有影响。

      【讨论】:

        【解决方案5】:

        你不应该期望看到任何现实生活中的性能差异

        【讨论】:

        • 一点一点。从一切中拯救。它堆积起来了!
        【解决方案6】:

        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 防止执行无用的连接

        【讨论】:

          【解决方案7】:

          如果您实际上不希望将 0 用作值,我认为可以使用 0 代替 NULL。

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

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

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

          希望这是有道理的。

          【讨论】:

            【解决方案8】:

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

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

            在您的 parent_id 引用示例中使用 0,在您确保没有以 id 0 开头的引用 id 之前没有问题。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2023-04-06
              • 1970-01-01
              • 2013-12-08
              • 2013-08-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-07-13
              相关资源
              最近更新 更多