我正在研究一些 PHP 代码优化,在进行过程中我发现了一些具有以下条件的 SELECT 语句:
WHERE `date_exported` = '0000-00-00 00:00:00' OR `date_exported` IS NULL
这让我想知道相同的语句是否仅在一个条件下工作相同:与 NULL 比较或与“无效”日期时间比较。
我将在此基础上添加:使用 MySQL Workbench 和 Datagrip(或 PhpStorm 等工具中的等效工具),我无法看到带有NULL
but的列0000-00-00 00:00:00
。我不确定这是否是一个配置问题,或者是否应该是这样。
这是 MySQL 5.7 ,我无权检查配置内容或了解此实例的配置方式。
我尝试在这里设置一个游乐场,但它不允许我添加0000-00-00 00:00:00
NULLdatetime
列
设置SQL_MODE
如下:
NO_ZERO,IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
注意:它0000-00-00 00:00:00
根本无效吗?
请提供
SHOW VARIABLES LIKE "SQL_MODE";
并查找NO_ZERO_DATE
。避免的话会更有效率
OR
。考虑在 期间“修复”数据
INSERTs
。这避免了在 期间需要麻烦它SELECTs
。由于默认值为
NO_ZERO_DATE
,我建议朝该方向移动。cf https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_show_old_temporals我没有关于从“zero_date”转变的详细信息,因此我无法说出 5.7 在频谱中的位置。
我不知道你是否可以这样做(一次一列)。
对于任何日期时间也是如此。
我尝试使用类似你的 WHERE .. OR .. 的东西,但我得到了
ERROR 1525 (HY000): Incorrect DATE value: '0000-00-00'
. 但后来我已经NO_ZERO_DATE
设定了。我希望我已经给你指明了正确的方向;很抱歉没有完整的答案。
不,同一个声明不适用于这两种情况。
null
是未知值,而0000-00-00 00:00:00
是已知值。Null 只能使用 来求值
is/is not null
,而0000-00-00 00:00:00
可以使用=
,<>
..等来求值。来自DATE、DATETIME 和 TIMESTAMP 类型
我想说的是无效的,也许它代表一个未知的值,最好使用 null 代替。
为了获得更好的性能,我有什么建议?
将表结构更改为以下形式并更新值。
使用以下方法前请做好备份。
如果您使用的是 InnoDB 存储引擎,请使用
在查询中只保留以下条件,索引
date_exported
就足够了。参见示例