Mysql
 sql >> Base de données >  >> RDS >> Mysql

Insertion MySQL dans DATETIME :est-il sûr d'utiliser le format ISO ::8601 ?

Il semble que la réponse courte à cette question soit "Non, ce n'est pas sûr" - cette conclusion fait suite à une série d'expériences avec le shell MySQL. J'apprécierais quand même une réponse plus "théorique", cependant...

Apparemment, le moteur MySQL est (par défaut) assez libéral dans ce qu'il accepte comme littéral Datetime même avec sql_mode défini sur STRICT_ALL_TABLES :non seulement divers séparateurs sont acceptés, mais ils peuvent également différer :

INSERT INTO t(dt) VALUES('2012-01,03.04:[email protected]'); -- Query OK, 1 row affected

De plus, si la chaîne est trop courte, elle sera complétée par des zéros... mais il peut y avoir des surprises :

INSERT INTO t(dt) VALUES('2012011'); -- 2020-12-01 01:00:00 is what's inserted

Le plus triste est que la chaîne trop longue (lorsque le dernier chiffre analysable est suivi d'autre chose qu'un espace) sera considérée comme une valeur invalide en mode strict :

mysql> INSERT INTO t(dt) VALUES('2012-06-27T05:25Z');
ERROR 1292 (22007): Incorrect datetime value: '2012-06-27T05:25Z' for column 'dt' at row 1
mysql> INSERT INTO t(dt) VALUES('2012-06-27T05:25');
Query OK, 1 row affected (0.10 sec)

Dans le mode traditionnel, l'analyse est encore plus détendue - mais pas plus précise ; de plus, les chaînes considérées comme incorrectes en mode strict donneront une sorte d'"avertissements silencieux", bien que les opérations réussissent :

mysql> INSERT INTO t(dt) VALUES('2012-06-27T05:25Z');
Query OK, 1 row affected, 1 warning (0.10 sec)

mysql> SHOW WARNINGS;
+---------+------+---------------------------------------------+
| Warning | 1264 | Out of range value for column 'dt' at row 1 |
+---------+------+---------------------------------------------+

mysql> SELECT dt FROM t;
+---------------------+
| dt                  |
+---------------------+
| 2012-06-27 05:25:00 |
+---------------------+

En fin de compte, nous avons dû réécrire du code lié à DAL afin que les dates (et les dates/heures) soient toujours envoyées à la base de données sous une forme "normalisée". Je me demande pourquoi c'est nous qui devons le faire, et non les développeurs de Zend_Db. Mais c'est une autre histoire, je suppose. )