MySQL 5.6 Data i godzina Niepoprawna wartość godziny / godziny: „2013-08-25T17: 00: 00 + 00: 00” z kodem błędu 1292

15

Korzystam z MySQL 5.6 i mam program, który uruchamia następującą instrukcję SQL w mojej bazie danych:

UPDATE `m_table` SET `s_time` = '2013-08-25T17:00:00+00:00' WHERE id = '123' 

Bez wątpienia pojawia się następujący błąd: Niepoprawna wartość daty / godziny: „2013-08-25T17: 00: 00 + 00: 00” dla kolumny „s_time” w wierszu 1

Typem danych dla s_time jest DateTime.

Próbowałem już ustawić właściwość allow_invalid_dates przy użyciu środowiska roboczego.

Czy ktoś może zrozumieć i wyjaśnić mi ten błąd? Wiem, że jeśli ręcznie zmienię instrukcję na UPDATE m_tableSET s_time= '2013-08-25 17:00:00' WHERE id = '123', instrukcja działa.

Niestety nie mogę modyfikować programu, który dostarcza instrukcję SQL (która według mnie jest ważna przez twórcę programu), a także nie rozumiem, co symbolizuje +00: 00.

Dzięki

Andrzej
źródło

Odpowiedzi:

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

Jest to poprawna wartość daty / godziny iso-8601 , ale nie jest to prawidłowy literał daty / godziny MySQL . W tym momencie deweloper jest niepoprawny.

Dokumentacja wyjaśnia, co ALLOW_INVALID_DATESrobi:

Sprawdź tylko, czy miesiąc mieści się w przedziale od 1 do 12, a dzień w przedziale od 1 do 31.

Innymi słowy, 2013-02-31byłaby dopuszczalna data, jeśli allow_invalid_dateszostanie ustawiona. Ta opcja nic nie robi, gdy data lub data nie są nawet w prawidłowym formacie dla MySQL.

To +00:00przesunięcie strefy czasowej od UTC . W tym przypadku wyrażony czas jest w UTC, więc przesunięcie wynosi zero godzin, zero minut.

Twój obejście byłoby usunąć STRICT_TRANS_TABLESz sql_modektóry jest domyślny w pliku konfiguracyjnym utworzonym podczas instalacji MySQL 5.6 ... trzeba starannie rozważyć konsekwencje zmieniających się to, ale nie pozwala dane iść.

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)
Michael - sqlbot
źródło
Dziękuję Ci. Na koniec poprosiłem programistę o zmianę kodu PHP, który utworzył instrukcję SQL, aby spełniała standard MySQL, ale jest to interesujące obejście. Dziwne jest to, że oryginalna instrukcja SQL działa w starszych wersjach MySQL.
Andrew
2
Dołączenie STRICT_TRANS_TABLESdo domyślnego pliku konfiguracyjnego zostało wprowadzone tylko w MySQL 5.6, co wyjaśnia zmianę zachowania ... jeśli włączysz to SQL_MODEw poprzednich wersjach, zapytanie również się nie powiedzie.
Michael - sqlbot
Właśnie uratowałeś mi życie. Wielkie dzięki za odpowiedź!
rafaels88