在MySQL中,使用零日期“0000-00-00 00:00:00”还是NULL更好?

14

在MySQL数据库中,使用默认日期“0000-00-00 00:00:00”还是NULL更好呢?

我读到最好使用默认日期“0000-00-00 00:00:00”的原因是计算的需要。

比一个日期小的日期要好。

对于时间,如果时间不确定,最好存储00:00NULL


12
请使用 NULL0000-00-00 00:00:00 不是有效的日期(MySQL的JDBC驱动程序也会拒绝加载它)。对于时间部分,您必须使用 NULL,因为午夜零点是一个实际的时间,所以无法区分午夜和“无时间”。请注意,此处不能使用解释性文字,只需进行翻译即可。 - user330315
1
我通常使用 null 表示“未知”。只要您知道分配的值,如果您的应用程序正确处理它,您可以使用它。 - Joe Phillips
1
如果你期望一个值,那么你的默认值不应该是 NULL - Kermit
4
MySQL允许您将“零”值存储为“虚拟日期”的'0000-00-00'。在某些情况下,这比使用NULL值更方便,并且使用的数据和索引空间更少。要禁止使用'0000-00-00',请启用NO_ZERO_DATE SQL模式。 - Matthew Chambers
2
请阅读此处 - https://dev.mysql.com/doc/refman/5.5/zh-cn/date-and-time-types.html - Matthew Chambers
显示剩余8条评论
3个回答

6
你应该使用NULL,因为0000-00-00 00:00:00不是一个有效的日期。如果你使用像moment.jsCarbon这样的库来管理日期,它们都知道如何处理NULL日期。
MySQL配置应始终设置为:
SET sql_mode = 'NO_ZERO_DATE';

除非你必须处理旧数据库,否则不建议使用“零日期”。

根据MySQL文档

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

如果您使用Windows:

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

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

  • '0000-00-00' < '2018-12-12'吗?
  • '0000-00-00' 表示“未知”吗?
  • '0000-00-00' 表示“null”吗?

除非您的答案是第一个问题并且需要与null日期进行比较,否则始终使用NULL值比较清晰易懂。


+1. 我刚刚追踪到一个生产错误,其中一个(表面上)非空的MySQL DATETIME列中存在一些值为'0000-00-00 00:00'的情况。而ActiveRecord / Rails却愉快地将这些值读取为nil,在尝试对它们进行日期比较时触发了NoMethodError: undefined method '>' for nil:NilClass错误。 - Jon Schneider

5

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


-4

为了支持所有日期时间操作,应该将默认值设置为 NOT NULL。 我也使用“0000-00-00 00:00:00”作为默认值。


1
@MatthewChambers 在 http://www.fromdual.com/using-null-as-default-values 中讨论了相反的观点是正确答案,尽管我个人认为使用默认值 0000-00-00 更好。在评论中提到了一个操作,如果字段可以为空,则该操作无法正常工作 SELECT * FROM t WHERE city=city - Timo Huovinen
1
我同意@MatthewChambers的观点,即0000-00-00是最好的答案。 - Herman J. Radtke III
4
NULL表示缺少值或无法确定:https://zh.wikipedia.org/wiki/Null 。处理空值意味着您编写的代码不那么特定于MySQL。我认为这也可能会导致理解上的问题,例如,如果您查询日期列<某个具体日期,则还将返回0000-00-00。如果0000-00-00表示“未知”,则这些结果是错误的,因为您无法确定“未知”是否真的小于(或大于或等于)某个具体日期。或者,如果0000-00-00表示“未知”(即0000-00-00 < 2015-01-01是有效的),则所有开发人员必须同意/学习为什么要使用这种方式,并且要保持一致。 - stifin
在编程中,使用虚假值来表示“未知”是非常糟糕的实践。你很可能会遇到这样的情况:使用“00:00:00”,“2031-01-01 00:00:00”,“1970-01-01”等作为“未知”值,并且不清楚哪些值被用作未知值,哪些没有。在SQL中已经有一个明确的值来表示未知,即“NULL”,请使用它。 - CervEd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接