【问题标题】:Better to use zero-date '0000-00-00 00:00:00' or NULL in MySQL?最好在 MySQL 中使用零日期 '0000-00-00 00:00:00' 或 NULL?
【发布时间】:2012-09-18 18:07:29
【问题描述】:

在 MySQL 数据库上使用默认日期 '0000-00-00 00:00:00' 或 NULL 是更好的做法吗?

出于计算的原因,我已阅读最好使用默认日期“0000-00-00 00:00:00”

>than 一个日期小于一个日期。

如果时间未知,最好按时存储00:00NULL

【问题讨论】:

  • 使用NULL0000-00-00 00:00:00 不是有效的日期(顺便说一句,MySQL 的 JDBC 驱动程序将拒绝加载该日期)。对于您必须使用NULL 的时间,因为 00:00 是实时时间(午夜)。所以你无法区分午夜和“没有时间”。
  • 我通常使用 null 来表示“未知”。只要你知道你分配了什么值,如果你的应用正确处理它,你就可以使用它
  • 如果你期望一个值,你的默认值不应该是NULL
  • MySQL 允许您将“0000-00-00”的“零”值存储为“虚拟日期”。在某些情况下,这比使用 NULL 值更方便,并且使用更少的数据和索引空间。要禁止“0000-00-00”,请启用 NO_ZERO_DATE SQL 模式。

标签: mysql


【解决方案1】:

MySQL 5.7 默认不允许0000-00-00 00:00:00 作为默认值,除非你设置了sql_mode = ''。似乎 MySQL 希望您使用 NULL 作为默认值。

【讨论】:

    【解决方案2】:

    您应该使用NULL,因为0000-00-00 00:00:00 不是有效日期。如果您使用诸如moment.jsCarbon 之类的库来管理日期,它们都知道如何处理NULL 日期。

    MySQL 配置应始终设置为:

    SET sql_mode = 'NO_ZERO_DATE';
    

    除非您必须处理旧数据库。

    也就是说,根据MySQL Documentation

    MySQL 允许您将“0000-00-00”的“零”值存储为“虚拟日期”。在某些情况下,这比使用 NULL 值更方便,并且使用更少的数据和索引空间。要禁止“0000-00-00”,请启用 NO_ZERO_DATE 模式。

    如果您使用的是 Windows:

    通过连接器/ODBC 使用的“零”日期或时间值会自动转换为 NULL,因为 ODBC 无法处理此类值。

    另外需要考虑的一点是:零日期的真正含义是什么?

    • '0000-00-00'
    • “0000-00-00”是否意味着“未知”?
    • “0000-00-00”是否意味着“空”?

    除非您的答案是第一个并且您需要与空日期进行比较,否则使用 NULL 值总是不会那么混乱。

    【讨论】:

      【解决方案3】:

      默认值应为 NOT NULL 以支持所有日期时间操作。 我还使用“0000-00-00 00:00:00”作为默认值。

      【讨论】:

      • @MatthewChambers fromdual.com/using-null-as-default-values 讨论了相反的正确答案,尽管我个人认为使用默认的 0000-00-00 更好。提到了一项操作,它是 cmets,如果该字段可以为 null SELECT * FROM t WHERE city=city,则该操作不起作用
      • 我同意@MatthewChambers 的观​​点,即 0000-00-00 是最佳答案。
      • NULL 表示缺少值/“未知”:en.wikipedia.org/wiki/Null_(SQL)。处理空值意味着您以一种对 MySQL 不那么特殊的方式进行编码。我也相信它可以引入可理解性问题,例如如果您查询日期列 或 =)具体日期?或者,如果 0000-00-00 not 表示“未知”(即 0000-00-00
      • 使用虚假值来表示unknown 是一种非常糟糕的做法,您很可能会遇到00:00:002031-01-01 00:00:001970-01-01 等被用作@ 的情况987654328@ 并且不清楚哪些值被用作未知数,哪些不是。在 SQL 中已经有一个明确的值,NULL,使用它
      猜你喜欢
      • 2013-06-09
      • 2017-09-21
      • 2013-07-12
      • 2015-07-19
      • 1970-01-01
      • 2016-06-04
      • 1970-01-01
      • 1970-01-01
      • 2015-11-28
      相关资源
      最近更新 更多