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' 

К сожалению, я получаю следующую ошибку: Неверное значение даты и времени: «2013-08-25T17: 00: 00 + 00: 00» для столбца «s_time» в строке 1

Тип данных для s_time - DateTime.

Я уже пытался установить свойство allow_invalid_dates с помощью рабочей среды.

Может кто-нибудь понять и, пожалуйста, объясните мне эту ошибку? Я знаю, что если я вручную изменю оператор на UPDATE m_tableSET s_time= '2013-08-25 17:00:00' WHERE id = '123', оператор сработает.

К сожалению, я не могу изменить программу, которая предоставляет оператор SQL (который, как мне сказали, действителен создателем программы), и я также не могу понять, что символизирует +00: 00.

Благодарность

Ответы:


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

Это допустимое значение даты -времени 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)

Спасибо. В конце я попросил программиста изменить код PHP, который создал инструкцию SQL, для соответствия стандарту MySQL, но это интересный обходной путь. Странно то, что оригинальный оператор SQL работает в более старых версиях MySQL.
Андрей

2
Включение STRICT_TRANS_TABLESв файл конфигурации по умолчанию было введено только в MySQL 5.6, который объясняет изменение поведения ... если вы включите это SQL_MODEв предыдущих версиях, запрос будет прерываться и в этих версиях.
Майкл - sqlbot

Ты только что спас мне жизнь. Большое спасибо за ответ!
rafaels88
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.