'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)