尝试将值插入表时出现MySQL datetime错误

时间:2018-03-26 15:39:54

标签: mysql

当我尝试在MySQL表的时间戳字段中插入日期时间值时,出现以下错误。我试图通过运行Python代码来做到这一点。

 _mysql_exceptions.OperationalError: (1292, "Incorrect datetime value: '2018-03-26 10:59:27+00:00' for column 'timestamp' at row 1")

是否有针对此错误的变通方法或解决方案?

1 个答案:

答案 0 :(得分:1)

  

2018-03-26 10:59:27 + 00:00

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

该文档解释了ALLOW_INVALID_DATES的作用:

Check only that the month is in the range from 1 to 12 and the day is in the range from 1 to 31.

换句话说,如果设置了allow_invalid_dates,则2018-03-26将是允许的日期。当日期或日期时间即使是MySQL的有效格式时,此选项也不会执行任何操作。

+00:00是UTC的时区偏移量。在这种情况下,表示的时间以UTC为单位,因此偏移量为零小时,零分钟。

您的解决方法是从sql_mode中删除STRICT_TRANS_TABLES,这是在MySQL 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 ('2018-03-26 10:59:27+00:00');
ERROR 1292 (22007): Incorrect datetime value: '2018-03-26 10:59:27+00:00' for column 'dt' at row 1

- 删除STRICT_TRANS_TABLES - 请注意,执行此操作只会删除它 - 当前会话 - 它不会进行服务器范围的配置更改

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)

- 现在MySQL将接受无效值,并带有警告

mysql> insert into datetimetest(dt) values ('2018-03-26 10:59:27+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)

- 确实插入了值,但时区信息丢失了:

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