不正确的日期时间值数据库错误号: 1292

2022-08-30 10:44:02

不正确的日期时间值 0000-00-00 00:00:00 +0000 数据库错误编号: 1292

嗨,大家好,我在托管公司完成的服务器升级方面遇到了问题,我正试图了解正在发生的事情,以便我可以解决问题

我的服务器最近已升级到服务器版本:5.6.17,并且我到处都收到错误,说我的日期时间值不正确?

它似乎在日期时间的末尾添加+0000,但我不确定为什么。这曾经在5.5上工作得很好,但最近的升级影响了我的时间戳的工作方式。

Error Number: 1292

Incorrect datetime value: '2014-04-02 08:49:43 +0000' for column 'created' at row 1

INSERT INTO `activitylog` (`tablename`, `row`, `user_id`, `description`, `action`, `private`,`created`) VALUES ('user', '1', '1', 'People', 'Updated', 0, '2014-04-02 08:49:43 +0000')

如果我在没有+0000的情况下修改此sql查询,它有效吗?

它会影响我桌子上的任何类型的DATETIME。

有没有其他人遇到过类似的问题,现在的解决方案是什么才能让它工作。目前,我必须更改所有PHP函数以回显日期/时间,而不是在查询字符串上调用NOW()


答案 1

升级到MySQL 5.7后,我发现此错误开始在随机情况下发生,即使我没有在查询中提供日期也是如此。

这似乎是因为以前版本的MySQL支持日期,例如(默认情况下),但是5.7.4对设置进行了一些更改。如果您在使用较新的MySQL版本时仍然存在旧数据,则可能会出现随机错误。0000-00-00 00:00:00NO_ZERO_DATE

我需要执行这样的查询,将所有零日期重置为另一个日期。

# If the columns supports NULL, use that
UPDATE table SET date_column = NULL WHERE date_column < '1000-01-01';

# Otherwise supply another default date
UPDATE table SET date_column = '1970-01-01' WHERE date_column < '1000-01-01';

或者,您也可以调整设置,但请注意文档对此的看法:NO_ZERO_DATE

该模式会影响服务器是否允许“0000-00-00”作为有效日期。其效果还取决于是否启用了严格 SQL 模式。NO_ZERO_DATE

  • 如果未启用此模式,则允许使用“0000-00-00”,并且插入不会产生警告。

  • 如果启用此模式,则允许使用“0000-00-00”,并且插入将产生警告。

  • 如果启用此模式和严格模式,则不允许使用“0000-00-00”,并且插入将产生错误,除非同时给出 IGNORE。对于 和 ,允许使用 '0000-00-00',并且插入会发出警告。INSERT IGNOREUPDATE IGNORE

从MySQL 5.7.4开始,已弃用。在 MySQL 5.7.4 到 5.7.7 中,显式命名时不执行任何操作。相反,它的影响包含在严格 SQL 模式的效果中。在MySQL 5.7.8及更高版本中,显式命名时确实会产生影响,并且不像MySQL 5.7.4之前那样是严格模式的一部分。但是,它应与严格模式结合使用,并且默认情况下处于启用状态。如果在未启用严格模式的情况下启用,则会出现警告,反之亦然。有关其他讨论,请参阅 MySQL 5.7 中的 SQL 模式更改。NO_ZERO_DATENO_ZERO_DATENO_ZERO_DATENO_ZERO_DATE

由于已弃用,因此它将在将来的MySQL版本中作为单独的模式名称被删除,其效果包含在严格SQL模式的效果中。NO_ZERO_DATE

http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_zero_date


答案 2

好吧,所以我遇到了同样的错误。我所做的修复是使用这些代码行来查询我遇到问题的数据库:

SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session;
SET sql_mode = '';
SET GLOBAL sql_mode = '';

第一行代码 (SELECT) 是查看“会话”和“全局”的当前设置。一旦将它们都设置为空字符串并再次运行 select,它们应该不返回任何内容(为空)。

您可能还需要使用,但这为我解决了问题。基本上,其中的一个设置是提升日期进入数据库的方式(我以“YYYY-MM-DD HH:MM:SS AM/PM”格式获取它)。删除和其他日期选项对我没有帮助。SET SESSION sql_mode = '';NO_ZERO_IN_DATE

我的网站正在像现在一样工作。希望这有帮助。


推荐