Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Inserção do MySQL para DATETIME:é seguro usar o formato ISO::8601?


Parece que a resposta curta para esta pergunta é "Não, não é seguro" - esta conclusão segue uma série de experimentos com o shell do MySQL. Ainda gostaria de uma resposta mais "teórica", embora ...

Aparentemente, o mecanismo MySQL é (por padrão) bastante liberal no que aceita como literal de data e hora, mesmo com sql_mode defina como STRICT_ALL_TABLES :não apenas vários separadores são aceitos, eles também podem diferir:

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

Além disso, se a string for muito curta, ela será preenchida com zeros... mas pode haver surpresas:

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

O triste é que a string muito longa (quando o último dígito analisável é seguido por algo diferente de espaço em branco) será considerado um valor inválido no modo estrito:
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)

No modo tradicional, a análise é ainda mais relaxada - mas não mais precisa; além disso, as strings consideradas incorretas no modo estrito darão uma espécie de 'avisos silenciosos', embora as operações sejam bem-sucedidas:
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 |
+---------------------+

A conclusão é que tivemos que reescrever alguns códigos relacionados a DAL para que as datas (e datas) sejam sempre enviadas ao banco de dados no formato "normalizado". Eu me pergunto por que somos nós que temos que fazer isso, e não os desenvolvedores Zend_Db. Mas isso é outra história, suponho. )