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

Posted

技术标签:

【中文标题】日期时间值不正确 数据库错误号:1292【英文标题】:Incorrect datetime value Database Error Number: 1292 【发布时间】:2014-05-13 11:10:45 【问题描述】:

不正确的日期时间值 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()

【问题讨论】:

error code 1292 incorrect date value mysql的可能重复 看我的更新:1 个答案... 注意骗局,这是关于无效的日期格式,这大约是零时间。 【参考方案1】:

我也遇到了同样的问题。

我在命令下运行,它对我有用。

SET SESSION SQL_MODE='ALLOW_INVALID_DATES'

【讨论】:

这对我有用,但可能不是你想的那样。如果我将ALLOW_INVALID_DATES 附加到现有的SQL_MODE 值,它并不能解决问题。但是,如果我从SQL_MODE 中删除STRICT_TRANS_TABLES(正如他的回答中提到的@RDVS)或者只是将SQL_MODE 设置为一个空字符串,它确实有效。所以我不相信ALLOW_INVALID_DATES 在这种情况下实际上在做任何事情,除了值不包括STRICT_TRANS_TABLES 这对我有用,并且它可以在脚本的上下文中运行,以避免在建立连接之前更改配置。【参考方案2】:

原始 my.cnf 的 sql_model 设置如下:

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

我尝试删除 NO_ZERO_IN_DATE 和 NO_ZERO_DATE 但没有效果。但是,如果我删除了所有术语(sql_mode 为空),错误就消失了。

我回到原来的 sql_mode 并认为我会逐一删除术语以查看哪个是原因。第一次尝试是删除 STRICT_TRANS_TABLES:

sql_mode=NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

没有错误。所以看起来 STRICT_TRANS_TABLES 是原因。

【讨论】:

这对我有用。对STRICT_TRANS_TABLES 所做的更改以及它与其他“零”设置的关系在MySQL version 5.7.8 的发行说明中进行了讨论。【参考方案3】:

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

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

第一行代码 (SELECT) 用于查看“SESSION”和“GLOBAL”的当前设置。一旦将它们都设置为空字符串并再次运行选择,它们应该什么都不返回(为空)。

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

我的网站现在正常运行。希望这会有所帮助。

【讨论】:

这个解决方案对我有用(删除 NO_ZERO_IN_DATE 没有帮助)。我不得不删除并重新创建数据库,以防万一帮助某人(我试图恢复 WordPress 网站的数据库备份) 我相信通过将SQL_MODE 设置为空字符串,您将删除STRICT_TRANS_TABLES,这是导致问题的实际设置,正如@RDVS 在他的回答中提到的那样。 你救了我的命 设置会话 sql_mode = '';为我修好了 - 谢谢。【参考方案4】:

我在升级到 MySQL 5.7 后发现,这个错误开始随机发生,即使我没有在查询中提供日期。

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

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

# 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 设置,但请注意文档对此的说法:

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

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

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

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

从 MySQL 5.7.4 开始,NO_ZERO_DATE 已弃用。在 MySQL 5.7.4 到 5.7.7 中,NO_ZERO_DATE 在显式命名时什么都不做。相反,它的效果包含在严格 SQL 模式的效果中。在 MySQL 5.7.8 及更高版本中,NO_ZERO_DATE 在显式命名时确实有效,并且不属于严格模式,就像 MySQL 5.7.4 之前一样。但是,它应该与严格模式结合使用,并且默认启用。如果启用NO_ZERO_DATE 而不启用严格模式,则会出现警告,反之亦然。有关其他讨论,请参阅 MySQL 5.7 中的 SQL 模式更改。

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

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

【讨论】:

对我来说,问题是我的where 是错误的数字,而它应该是一个字符串。我试图运行 DB::table('contacts')-&gt;where('adId', 8888544168061)-&gt;update(['campaignId' =&gt; 8888626793661, 'adsetId' =&gt; 8888631774261]); 而不是 DB::table('contacts')-&gt;where('adId', '8888544168061')-&gt;update(['campaignId' =&gt; 8888626793661, 'adsetId' =&gt; 8888631774261]); 升级 MySQL 后确实发生在我身上......但我不明白你的答案...... 这与NO_ZERO_DATE 设置有关,但还有更多内容,特别是如何对STRICT_TRANS_TABLES 进行更改,以及它与发行说明中讨论的其他“零”设置有何关系为MySQL version 5.7.8。如果您使用的是 MySQL 5.7.8 或更高版本,您可能会发现从 SQL_MODE 中删除 STRICT_TRANS_TABLES 可以解决问题,正如@RDVS 在他的回答中提到的那样。【参考方案5】:

简短回答 - 您查询中的 NOW() 应该与 MySQL DATETIME 列完美配合。

更长的答案 - 我不确定你是如何看到 +0000 工作的。 DATETIME 列的格式为'YYYY-MM-DD HH:MM:SS'。当涉及到时区差异时,通常需要以编程方式处理。 MySQL 在存储和检索 TIMESTAMP 数据时确实将本地时间转换为 UTC 并再次返回 - 但它不会对 DATETIME 或其他日期/时间列执行此操作。

【讨论】:

这是我没做过的事情。就像我多年来所说的那样,我一直能够在服务器版本 5.5 上使用它,从来没有遇到过问题,但是最近升级到 5.6.17 时抛出了这个错误 我也有同样的问题。它一直在工作。共享主机可能会更新 mysql,现在 BOOM: Internal Server Error: 22007, 1292, Incorrect datetime value: '2016-09-12 18:30:00 UTC' for column 'xxxxxxx' at row 1... 问题是我不知道'字符串中甚至没有'UTC',它是mysql错误消息的一部分...... 没错,我在继承代码上使用timestamp 列类型得到了这个。在我将列类型切换为datetime后它就消失了。【参考方案6】:

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

TIMESTAMP 数据类型用于同时包含日期和时间部分的值。 TIMESTAMP 的范围为 '1970-01-01 00:00:01' UTC'2038-01-19 03:14:07' UTC

DATETIME 类型用于同时包含日期和时间部分的值。 MySQL 以'YYYY-MM-DD HH:MM:SS' 格式检索并显示DATETIME 值。支持的范围是'1000-01-01 00:00:00' to '9999-12-31 23:59:59'

你应该使用这种类型:日期时间格式

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

https://dev.mysql.com/doc/refman/5.0/en/date-and-time-types.html

https://dev.mysql.com/doc/refman/5.0/en/datetime.html

http://bugs.mysql.com/bug.php?id=70188

更新:1

你应该像你的代码'2014-04-02 08:49:43 +0000'一样删除space,并像'2014-04-02 08:49:43+0000'一样更改代码,因为完整的查询如下:

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')

看这里:http://sqlfiddle.com/#!2/a2581/23099

【讨论】:

FWIW,这是由严格的 SQL 设置引起的:NO_ZERO_IN_DATE 只需从您的 my.cnf 或 my.ini 中删除 'NO_ZERO_DATE,NO_ZERO_IN_DATE'

以上是关于日期时间值不正确 数据库错误号:1292的主要内容,如果未能解决你的问题,请参考以下文章

#1292 运行查询时 MySQL 中不正确的日期时间值错误

在 Laravel 迁移中更改日期格式

日期时间格式无效:1366 字符串值不正确

将 NULL 插入 DATE 字段 MySQL 5.6

Python MySQLdb 日期时间值不正确:'2018-03-25 02:00:02'

MySQL 中的“2018-03-22 00:00:00”有啥问题?