'2013-08-25T17:00:00+00:00'
C'est une valeur datetime iso-8601 valide , mais ce n'est pas un littéral datetime MySQL valide . Sur ce point, le développeur est incorrect.
La documentation explique ce que ALLOW_INVALID_DATES
fait:
Vérifiez seulement que le mois est compris entre 1 et 12 et que le jour est compris entre 1 et 31.
En d'autres termes, 2013-02-31
serait une date autorisée si elle allow_invalid_dates
est définie. Cette option ne fait rien lorsque la date ou datetime n'est même pas dans un format valide pour MySQL.
Le +00:00
est le décalage horaire de UTC . Dans ce cas, le temps exprimé est en UTC, donc le décalage est zéro heure, zéro minute.
Votre solution serait de supprimer le STRICT_TRANS_TABLES
du sql_mode
qui est un défaut dans le fichier de configuration créé pendant le processus d'installation MySQL 5.6 ... vous devez examiner attentivement les conséquences de l' évolution, mais elle ne permet aux données d'entrer.
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)
STRICT_TRANS_TABLES
dans un fichier de configuration par défaut n'a été introduite que dans MySQL 5.6, ce qui explique le changement de comportement ... si vous l'activezSQL_MODE
dans les versions précédentes, la requête se briserait également dans ces versions.