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

Inserisci MySQL in DATETIME:è sicuro usare il formato ISO::8601?

Sembra che la risposta breve a questa domanda sia "No, non è sicuro" - questa conclusione segue una serie di esperimenti con la shell MySQL. Apprezzerei comunque una risposta più "teorica", però...

Apparentemente il motore MySQL è (per impostazione predefinita) piuttosto liberale in ciò che accetta come valore letterale Datetime anche con sql_mode impostato su STRICT_ALL_TABLES :non solo sono accettati diversi separatori, possono anche differire:

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

Inoltre, se la stringa è troppo corta, verrà riempita di zeri... ma potrebbero esserci delle sorprese:

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

La cosa triste è che la stringa troppo lunga (quando l'ultima cifra analizzabile è seguita da qualcosa di diverso dagli spazi bianchi) sarà considerata un valore non valido in modalità rigorosa:

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)

Nella modalità tradizionale l'analisi è ancora più rilassata, ma non più precisa; inoltre, le stringhe che sono considerate errate nella modalità rigorosa daranno una sorta di 'avviso silenzioso', anche se le operazioni andranno a buon fine:

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

La linea di fondo è che abbiamo dovuto riscrivere del codice relativo a DAL in modo che le date (e le datetime) vengano sempre inviate al DB in forma "normalizzata". Mi chiedo perché dobbiamo farlo noi e non gli sviluppatori Zend_Db. Ma questa è un'altra storia, suppongo. )