当我尝试在MySQL表的时间戳字段中插入日期时间值时,出现以下错误。我试图通过运行Python代码来做到这一点。
_mysql_exceptions.OperationalError: (1292, "Incorrect datetime value: '2018-03-26 10:59:27+00:00' for column 'timestamp' at row 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)