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

Luk*_*gan 24 php mysql database datetime

不正确的日期时间值0000-00-0000: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')
Run Code Online (Sandbox Code Playgroud)

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

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

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

Sim*_*ast 20

升级到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';
Run Code Online (Sandbox Code Playgroud)

或者,您可以调整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


cal*_*jed 10

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

SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session;
SET sql_mode = '';
SET GLOBAL sql_mode = '';
Run Code Online (Sandbox Code Playgroud)

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

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

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


Rag*_*ata 8

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

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


小智 7

原来 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
Run Code Online (Sandbox Code Playgroud)

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

我回到原来的 sql_mode 并认为我会删除术语 1-by-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
Run Code Online (Sandbox Code Playgroud)

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


Omk*_*kar 7

我面临同样的问题。

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

SET SESSION SQL_MODE='ALLOW_INVALID_DATES'
Run Code Online (Sandbox Code Playgroud)


jma*_*ail 5

日期时间值不正确数据库错误号: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')
Run Code Online (Sandbox Code Playgroud)

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')
Run Code Online (Sandbox Code Playgroud)

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