日期时间值不正确 数据库错误号: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 IGNORE
和UPDATE 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')->where('adId', 8888544168061)->update(['campaignId' => 8888626793661, 'adsetId' => 8888631774261]);
而不是 DB::table('contacts')->where('adId', '8888544168061')->update(['campaignId' => 8888626793661, 'adsetId' => 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 中不正确的日期时间值错误