MySQL 5.6 DateTime Valor de data e hora incorreto: '2013-08-25T17: 00: 00 + 00: 00' com código de erro 1292

15

Estou usando o MySQL 5.6 e tenho um programa que executa a seguinte instrução SQL no meu banco de dados:

UPDATE `m_table` SET `s_time` = '2013-08-25T17:00:00+00:00' WHERE id = '123' 

Inesperadamente, recebo o seguinte erro: Valor de data e hora incorreto: '2013-08-25T17: 00: 00 + 00: 00' para a coluna 's_time' na linha 1

O tipo de dados para s_time é DateTime.

Eu já tentei definir a propriedade allow_invalid_dates usando o ambiente de trabalho.

Alguém pode entender e por favor me explicar esse erro? Eu sei que se eu alterar manualmente a instrução para UPDATE m_tableSET s_time= '2013-08-25 17:00:00' WHERE id = '123', a instrução funcionará.

Infelizmente, não consigo modificar o programa que fornece a instrução SQL (que me foi informada como válida pelo criador do programa) e também não consigo entender o que o +00: 00 simboliza.

obrigado

Andrew
fonte

Respostas:

24
'2013-08-25T17:00:00+00:00'

Este é um valor válido de data e hora iso-8601 , mas não é um literal válido para data e hora do MySQL . Nesse ponto, o desenvolvedor está incorreto.

A documentação explica o que ALLOW_INVALID_DATESfaz:

Verifique apenas se o mês está entre 1 e 12 e se o dia está entre 1 e 31.

Em outras palavras, 2013-02-31seria uma data permitida seallow_invalid_dates estiver definida. Esta opção não faz nada quando a data ou data e hora nem estão em um formato válido para o MySQL.

O +00:00é o deslocamento do fuso horário em relação ao UTC . Nesse caso, o tempo expresso é em UTC, portanto o deslocamento é zero horas, zero minutos.

Sua solução seria remover a STRICT_TRANS_TABLESpartir do sql_modeque é um padrão no arquivo de configuração criado durante o processo de instalação MySQL 5.6 ... você precisa considerar com cuidado as implicações da alteração isso, mas permite que os dados para entrar.

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)
Michael - sqlbot
fonte
Obrigado. No final, pedi ao programador que alterasse o código PHP que criou a instrução SQL para atender ao padrão MySQL, mas essa é uma solução interessante. O estranho é que a instrução SQL original funciona em versões mais antigas do MySQL.
Andrew
2
A inclusão STRICT_TRANS_TABLESde um arquivo de configuração padrão foi introduzida apenas no MySQL 5.6, o que explica a mudança de comportamento ... se você habilitar isso SQL_MODEnas versões anteriores, a consulta também será interrompida nessas versões.
Michael - sqlbot
Você acabou de salvar minha vida. Muito obrigado pela resposta!
Rafaels88 25/09/14