我正在使用 MySQL 5.7,我注意到一些我无法用我目前的知识向自己解释的事情,所以在这里解释一下。
“无效”日期是否被视为与没有可空值的列类型0000-00-00
相同?请参见以下示例:NULL
date
create table if not exists example
(
id int auto_increment primary key,
doskip date default '0000-00-00' not null
);
INSERT INTO example VALUES(1, '0000-00-00'), (2, '0000-00-00'), (3, '0000-00-00');
完成上述操作并运行以下查询后,我得到了完全相同的计数:3,我想知道为什么,对此有什么解释吗?
SELECT COUNT(*) FROM example j WHERE j.doskip = '0000-00-00';
SELECT COUNT(*) FROM example j WHERE j.doskip IS NULL;
下面是一个显示此行为的 Fiddle,这是因为模式吗?
'0000-00-00' 是一个神奇的标记,它同时是“空”和“不空”。你可以用以下方法扩展你的 fiddle:
甚至:
后者是矛盾的,但所有行都符合条件。您可以通过将 sql_mode 设置为 来使旧版本的 MySQL 更加合理
NO_ZERO_DATE
。在此过程中,还可以添加ONLY_FULL_GROUP_BY
另一个表明它的行为不像 null 的迹象是
计算结果为 TRUE,而:
计算结果为 FALSE。您可以尝试:
MySQL 8 与旧版本相比有了很大的改进。如果你想避免这些怪癖,你可以考虑升级
据我了解,
0000-00-00
在date
数据类型列上它被视为NULL
。来自使用 DATE 列的问题
在上面的语句中没有特别提到0000-00-00被视为NULL,但我猜想代码中的某个地方必须这样做。
文档中的另一个声明
注意,这适用于数据类型,而
date
不是datetime
timestamp
我的建议
通过使doskip date default 为 null 来修复表设计,因为doskip date default '0000-00-00' not null无论如何都没有任何意义。使用严格模式启用NO_ZERO_DATE,将所有从 '0000-00-00' 的值替换为 NULL。
Null 被视为未知值,只能通过使用 is null/is not null 来评估。'0000-00-00' 被视为未知日期,这就是开发人员可能应用相同规则的原因。