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.

Я вже намагався встановити властивість enable_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 datetime, але це не допустимий літерал MySQL datetime . З цього моменту розробник невірний.

Документації пояснює , що 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.