MySQL 5.6 DateTime错误的日期时间值:“ 2013-08-25T17:00:00 + 00:00”,错误代码1292


15

我正在使用MySQL 5.6,并且我有一个针对我的数据库运行以下SQL语句的程序:

UPDATE `m_table` SET `s_time` = '2013-08-25T17:00:00+00:00' WHERE id = '123' 

不幸的是,我收到以下错误:第1行的's_time'列的日期时间值不正确:'2013-08-25T17:00:00 + 00:00'

s_time的数据类型为DateTime。

我已经尝试使用工作台设置allow_invalid_dates属性。

谁能理解并请向我解释此错误?我知道,如果我手动将语句更改为UPDATE m_tableSET s_time='2013-08-25 17:00:00'WHERE id ='123',则该语句有效。

不幸的是,我无法修改提供SQL语句的程序(程序创建者告诉我该语句是有效的),并且我也无法理解+00:00的含义。

谢谢

Answers:


24
'2013-08-25T17:00:00+00:00'

这是有效的iso-8601 datetime值,但不是有效的MySQL datetime文字。在这一点上,开发人员是不正确的。

文档解释了ALLOW_INVALID_DATES做什么:

仅检查月份范围是1到12,日期范围是1到31。

换句话说,2013-02-31如果allow_invalid_dates设置的话,将是一个允许的日期。当日期或日期时间甚至不是MySQL的有效格式时,此选项也不执行任何操作。

+00:00是时区偏移从UTC。在这种情况下,时间是表示 UTC,所以偏移为零小时,零分钟。

您的解决方法是STRICT_TRANS_TABLESsql_modeMySQL 5.6安装过程中创建的配置文件中的默认设置中删除。您需要仔细考虑更改此设置的含义,但它确实允许数据进入。

mysql> select @@sql_mode;
+--------------------------------------------+
| @@sql_mode                                 |
+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+
1 row in set (0.00 sec)

mysql> insert into datetimetest(dt) values ('2013-08-26T12:00:00+00:00');
ERROR 1292 (22007): Incorrect datetime value: '2013-08-26T12:00:00+00:00' for column 'dt' at row 1

-- remove STRICT_TRANS_TABLES -- note that executing this only removes it for your
-- current session -- it does not make a server-wide config change

mysql> set @@sql_mode='no_engine_substitution';
Query OK, 0 rows affected (0.00 sec)

mysql> select @@sql_mode;
+------------------------+
| @@sql_mode             |
+------------------------+
| NO_ENGINE_SUBSTITUTION |
+------------------------+
1 row in set (0.00 sec)

-- now MySQL will accept the invalid value, with a warning

mysql> insert into datetimetest(dt) values ('2013-08-26T12:00:00+00:00');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> show warnings;
+---------+------+-----------------------------------------+
| Level   | Code | Message                                 |
+---------+------+-----------------------------------------+
| Warning | 1265 | Data truncated for column 'dt' at row 1 |
+---------+------+-----------------------------------------+
1 row in set (0.00 sec)

-- the value did get inserted, but the time zone information was lost:

mysql> select * from datetimetest;
+----+---------------------+
| id | dt                  |
+----+---------------------+
|  1 | 2013-08-26 12:00:00 |
+----+---------------------+
1 row in set (0.00 sec)

谢谢。最后,我要求程序员更改创建SQL语句的PHP代码以满足MySQL标准,但这是一个有趣的解决方法。奇怪的是,原始SQL语句可在旧版MySQL中使用。
安德鲁

2
包括STRICT_TRANS_TABLES在默认配置文件中的MySQL 5.6,这说明了其行为的变化......如果你启用此仅介绍SQL_MODE在以前的版本中,查询将打破在这些版本中,也。
Michael-sqlbot

你刚刚救了我的命。非常感谢您的回答!
rafaels88 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.