我正在使用 MySQL 5.6 并且我有一个程序可以对我的数据库运行以下 SQL 语句:
UPDATE `m_table` SET `s_time` = '2013-08-25T17:00:00+00:00' WHERE id = '123'
Run Code Online (Sandbox Code Playgroud)
不幸的是,我收到以下错误:日期时间值不正确:第 1 行的“s_time”列的“2013-08-25T17:00:00+00:00”
s_time 的数据类型是 DateTime。
我已经尝试使用工作台设置 allow_invalid_dates 属性。
任何人都可以理解并请向我解释这个错误吗?我知道,如果我手动将语句更改为 UPDATE m_table
SET s_time
= '2013-08-25 17:00:00' WHERE id = '123',则该语句有效。
不幸的是,我无法修改提供 SQL 语句的程序(程序的创建者告诉我这是有效的),而且我也无法理解 +00:00 代表什么。
谢谢
Mic*_*bot 25
'2013-08-25T17:00:00+00:00'
Run Code Online (Sandbox Code Playgroud)
这是一个有效的iso-8601日期时间值,但它不是有效的MySQL 日期时间文字。在这一点上,开发商是不正确的。
该文件说明了什么ALLOW_INVALID_DATES
呢:
只检查月份是否在 1 到 12 的范围内,日期是否在 1 到 31 的范围内。
换句话说,2013-02-31
如果allow_invalid_dates
设置为允许的日期。当日期或日期时间甚至不是 MySQL 的有效格式时,此选项不会执行任何操作。
该+00:00
是时区偏移从UTC。在这种情况下,时间是表示在UTC,所以偏移为零小时,零分钟。
您的解决方法是STRICT_TRANS_TABLES
从sql_mode
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 ('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)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
125321 次 |
最近记录: |