MySQL 5.6 DateTime Valore datetime errato: '2013-08-25T17: 00: 00 + 00: 00' con codice di errore 1292


15

Sto usando MySQL 5.6 e ho un programma che esegue la seguente istruzione SQL sul mio database:

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

Unututnately, ottengo il seguente errore: Valore datetime errato: '2013-08-25T17: 00: 00 + 00: 00' per la colonna 's_time' alla riga 1

Il tipo di dati per s_time è DateTime.

Ho già tentato di impostare la proprietà allow_invalid_dates utilizzando il workbench.

Qualcuno può capire e per favore spiegarmi questo errore? So che se cambio manualmente l'istruzione in UPDATE m_tableSET s_time= '2013-08-25 17:00:00' WHERE id = '123', l'istruzione funziona.

Sfortunatamente, non posso modificare il programma che fornisce l'istruzione SQL (che mi è stato detto è valido dal creatore del programma) e non riesco nemmeno a capire cosa simboleggia il +00: 00.

Grazie

Risposte:


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

Questo è un valore datetime iso-8601 valido, ma non è un valore letterale datetime MySQL valido . Su quel punto, lo sviluppatore non è corretto.

La documentazione spiega cosa ALLOW_INVALID_DATES:

Controlla solo che il mese sia compreso tra 1 e 12 e che il giorno sia compreso tra 1 e 31.

In altre parole, 2013-02-31sarebbe una data consentita se allow_invalid_datesimpostata. Questa opzione non fa nulla quando la data o il datetime non sono nemmeno in un formato valido per MySQL.

L' +00:00offset del fuso orario è UTC . In questo caso, il tempo espresso è in UTC, quindi l'offset è zero ore, zero minuti.

La vostra soluzione potrebbe essere quella di rimuovere il STRICT_TRANS_TABLESdal sql_modeche è un default nel file di configurazione creato durante il processo di installazione di MySQL 5.6 ... è necessario considerare con attenzione le implicazioni di questo cambiamento, ma non consentire i dati di andare in.

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)

Grazie. Alla fine ho chiesto al programmatore di modificare il codice PHP che ha creato l'istruzione SQL per soddisfare lo standard MySQL, ma questa è una soluzione interessante. La cosa strana è che l'istruzione SQL originale funziona nelle versioni precedenti di MySQL.
Andrew

2
L'inclusione STRICT_TRANS_TABLESin un file di configurazione predefinito è stata introdotta solo in MySQL 5.6, il che spiega la modifica del comportamento ... se si abilita questo SQL_MODEnelle versioni precedenti, la query si interromperà anche in quelle versioni.
Michael - sqlbot,

Mi hai appena salvato la vita. Grazie mille per la risposta!
rafaels88,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.