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

时间:2014-04-02 09:21:03

标签: php mysql database datetime

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

6 个答案:

答案 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 IGNOREUPDATE 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)

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

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

更新:1

您应该删除代码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')

查看此处:http://sqlfiddle.com/#!2/a2581/23099

答案 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是原因。