日期时间值不正确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()
答案 0 :(得分:12)
我在升级到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
模式会影响服务器是否允许&#39; 0000-00-00&#39;作为有效日期。它的效果还取决于是否启用了严格的SQL模式。
如果未启用此模式,&#39; 0000-00-00&#39;是允许的,插入不会产生警告。
如果启用此模式,&#39; 0000-00-00&#39;允许,插入产生警告。
如果启用此模式和严格模式,&#39; 0000-00-00&#39;不允许插入产生错误,除非同时给出IGNORE。对于
INSERT IGNORE
和UPDATE IGNORE
,&#39; 0000-00-00&#39;允许,插入产生警告。自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
答案 1 :(得分:8)
好的,所以我遇到了同样的错误。我所做的是修复它是使用这些代码行来查询我遇到问题的数据库:
SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session;
SET sql_mode = '';
SET GLOBAL sql_mode = '';
第一行代码(SELECT)是查看当前设置对于&#39; SESSION&#39;和&#39; GLOBAL&#39;。一旦你将它们都设置为空字符串并再次运行select,它们就不会返回任何内容(为空)。
您可能还需要使用SET SESSION sql_mode = '';
,但这解决了我的问题。基本上,其中一个设置是抬高了日期进入数据库的方式(我是在一个&#39; YYYY-MM-DD HH:MM:SS AM / PM&#39;格式)。删除NO_ZERO_IN_DATE
和其他日期选项对我没有帮助。
我的网站现在应该像它一样工作。希望这会有所帮助。
答案 2 :(得分:5)
简短回答 - 查询中的NOW()
应与MySQL DATETIME
列完美匹配。
更长的答案 - 我不确定你是如何看到+0000
工作的。 DATETIME
列的格式为'YYYY-MM-DD HH:MM:SS'
。当谈到时区差异时,通常需要以编程方式处理。当存储和检索TIMESTAMP
数据时,MySQL会将本地时间转换为UTC并再次返回 - 但它不会使用DATETIME
或其他日期/时间列执行此操作。
答案 3 :(得分:5)
我面临着同样的问题。
我在命令下运行,它对我有用。
SET SESSION SQL_MODE='ALLOW_INVALID_DATES'
答案 4 :(得分:4)
TIMESTAMP
数据类型用于包含日期和时间部分的值。 TIMESTAMP
的范围为'1970-01-01 00:00:01' UTC
到'2038-01-19 03:14:07' UTC
。
DATETIME
类型用于包含日期和时间部分的值。 MySQL以DATETIME
格式检索并显示'YYYY-MM-DD HH:MM:SS'
个值。支持的范围是'1000-01-01 00:00:00' to '9999-12-31 23:59:59'
。
您应该使用以下类型:DateTime格式
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 强> 的
您应该删除代码space
之类的'2014-04-02 08:49:43 +0000'
,并将完整查询更改为'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')
答案 5 :(得分:1)
原始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,以为我会删除1比1的术语以查看是哪一个原因。第一次尝试是删除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是原因。