sql >> Database teknologi >  >> RDS >> Mysql

MySQL-indsæt til DATETIME:er det sikkert at bruge ISO::8601-format?

Det ser ud til, at det korte svar på dette spørgsmål er "Nej, det er ikke sikkert" - denne konklusion følger en række eksperimenter med MySQL shell. Ville stadig sætte pris på et mere "teoretisk" svar...

Tilsyneladende er MySQL-motoren (som standard) ret liberal i, hvad den accepterer som en Datetime-literal, selv med sql_mode indstillet til STRICT_ALL_TABLES:ikke kun forskellige separatorer accepteres, de kan også variere:

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

Desuden, hvis strengen er for kort, vil den være polstret med nuller... men der kan være overraskelser:

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

Det triste er, at strengen for lang (når det sidste parserbare ciffer efterfølges af noget andet end mellemrum) vil blive betragtet som en ugyldig værdi i streng tilstand:

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)

I den traditionelle tilstand er parsing endnu mere afslappet - men ikke mere præcis; desuden vil de strenge, der betragtes som forkerte i den strenge tilstand, give en slags 'tavse advarsler', selvom operationer vil lykkes:

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 |
+---------------------+

Den nederste linje er, at vi var nødt til at omskrive noget DAL-relateret kode, så datoer (og datotider) altid sendes til DB i "normaliseret" form. Jeg undrer mig over, hvorfor det er os, der skal gøre det, og ikke Zend_Db-udviklere. Men det er en anden historie, formoder jeg. )



  1. Indsæt Update lagret proc på SQL Server

  2. MySQL på dubletnøgle... få eksisterende ID?

  3. mysql:select max(score) returnerer ikke de relevante rækkedata

  4. Sådan konverteres en krydstabuleringsforespørgsel tilbage til en normal forespørgsel i Access