我正在使用 MySQL 5.6,并且我有一个针对我的数据库运行以下 SQL 语句的程序:
UPDATE `m_table` SET `s_time` = '2013-08-25T17:00:00+00:00' WHERE id = '123'
不幸的是,我收到以下错误:不正确的日期时间值:‘2013-08-25T17:00:00+00:00’ for column ‘s_time’ at row 1
s_time 的数据类型是 DateTime。
我已经尝试使用工作台设置 allow_invalid_dates 属性。
谁能理解并请向我解释这个错误?我知道如果我手动将语句更改为 UPDATE m_tableSET s_time= ‘2013-08-25 17:00:00’ WHERE id = ‘123’,则该语句有效。
m_table
s_time
不幸的是,我无法修改提供 SQL 语句的程序(程序的创建者告诉我这是有效的),我也无法理解 +00:00 的符号。
谢谢
'2013-08-25T17:00:00+00:00'
这是一个有效的iso-8601日期时间值,但它不是一个有效的MySQL 日期时间文字。在这一点上,开发商是不正确的。
该文档解释了什么ALLOW_INVALID_DATES:
ALLOW_INVALID_DATES
仅检查月份是否在 1 到 12 的范围内,而日期是否在 1 到 31 的范围内。
换句话说,2013-02-31如果设置了,将是一个允许的日期allow_invalid_dates。当日期或日期时间甚至不是 MySQL 的有效格式时,此选项不会执行任何操作。
2013-02-31
allow_invalid_dates
是与UTC的+00:00时区偏移量。在这种情况下,时间表示为UTC,因此偏移量为零小时零分钟。
+00:00
您的解决方法是STRICT_TRANS_TABLES从sql_modeMySQL 5.6 安装过程中创建的配置文件中的默认值中删除…您需要仔细考虑更改它的含义,但它确实允许数据进入。
STRICT_TRANS_TABLES
sql_mode
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)