php 数据库错误号:1292

rryofs0p  于 2023-05-27  发布在  PHP
关注(0)|答案(8)|浏览(126)

datetime值不正确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')

如果我修改这个sql查询没有+0000它的作品?
它会影响我的表中的任何DATETIME类型。
有没有其他人有类似的问题,现在有什么解决方案是让这个工作。目前我想我必须改变我所有的PHP函数来回显日期/时间,而不是在查询字符串上调用NOW()

monwx1rj

monwx1rj1#

在升级到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*
3qpi33ja

3qpi33ja2#

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

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

第一行代码(SELECT)用于查看'SESSION'和'GLOBAL'的当前设置。一旦你将它们都设置为空字符串并再次运行select,它们应该什么都不返回(为空)。
您可能还需要使用SET SESSION sql_mode = '';,但这为我解决了这个问题。基本上,其中一个设置是在那里顶起的方式,日期进入数据库(我得到了它在一个'YYYY-MM-DD HH:MM:SS AM/PM'格式)。删除NO_ZERO_IN_DATE和其他日期选项对我没有帮助。
我的网站现在运行正常。希望这能帮上忙。

mbjcgjjk

mbjcgjjk3#

我也面临着同样的问题。
我服从命令,这对我很有效。

SET SESSION SQL_MODE='ALLOW_INVALID_DATES'
plupiseo

plupiseo4#

简短的回答-NOW()在你的查询中应该可以很好地与MySQL DATETIME列一起工作。
更长的答案-我不知道你是如何看到+0000工作的。DATETIME列的格式为'YYYY-MM-DD HH:MM:SS'。当涉及到时区差异时,通常需要以编程方式处理。MySQL在存储和检索TIMESTAMP数据时确实会将本地时间转换为UTC,但它不会对DATETIME或其他日期/时间列执行此操作。

jchrr9hc

jchrr9hc5#

原始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-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

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

xxe27gdn

xxe27gdn6#

datetime值不正确数据库错误号: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

pkbketx9

pkbketx97#

我发现,如果您有此问题,此查询可以从MySQL Incorrect datetime value: '0000-00-00 00:00:00'工作

UPDATE activitylog SET created = NULL
WHERE CAST(created AS CHAR(20)) = '0000-00-00 00:00:00';
xkftehaa

xkftehaa8#

我也面临着类似的问题,但当我应用@JedtheMarine发布的代码时,它解决了我的问题。
我的案子
更新记录时出错:第39行的列“XXX”的日期时间值“2022-04-03 12:00:00 AM”不正确

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

相关问题