Estou executando o MySql Server 5.7.11 e esta frase:
updated datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
não está funcionando. Dando o erro:
ERROR 1067 (42000): Invalid default value for 'updated'
Mas o seguinte:
updated datetime NOT NULL DEFAULT '1000-01-01 00:00:00'
apenas funciona .
O mesmo caso para DATE.
Como nota lateral , ele é mencionado na documentação do MySQL :
O tipo DATE é usado para valores com parte da data, mas sem parte da hora. O MySQL recupera e exibe os valores DATE no formato 'AAAA-MM-DD'. O intervalo compatível é de '1000-01-01' a '9999-12-31'.
mesmo que também digam:
Valores inválidos de DATE, DATETIME ou TIMESTAMP são convertidos para o valor “zero” do tipo apropriado ('0000-00-00' ou '0000-00-00 00:00:00').
Tendo também em conta a segunda citação da documentação do MySQL, alguém poderia me informar por que está apresentando esse erro?
NULL
para isso.Respostas:
O erro é devido ao modo sql, que pode ser o modo estrito de acordo com a documentação MYSQL 5.7 mais recente
A documentação do MySQL 5.7 diz :
Para verificar o modo MYSQL
SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session
Desativando o modo STRICT_TRANS_TABLES
No entanto, para permitir o formato
0000-00-00 00:00:00
você deve desabilitar o modo STRICT_TRANS_TABLES no arquivo de configuração mysql ou por comandoPor comando
SET sql_mode = '';
ou
SET GLOBAL sql_mode = '';
Usando a palavra-chave
GLOBAL
requer super previlégios e afeta as operações que todos os clientes se conectam a partir daquele momentose acima não estiver funcionando, vá para
/etc/mysql/my.cnf
(de acordo com o ubuntu) e comenteSTRICT_TRANS_TABLES
Além disso, se você deseja definir permanentemente o modo sql na inicialização do servidor, inclua
SET sql_mode=''
nomy.cnf
Linux ou MacOS. Para Windows, isso deve ser feito emmy.ini
arquivo.Nota
No entanto, o modo estrito não é habilitado por padrão no MYSQL 5.6. Portanto, ele não produz o erro de acordo com a documentação MYSQL 6 que diz
ATUALIZAR
Em relação ao bug, como dito por @ Dylan-Su:
Não acho que esse seja o bug da maneira como o MYSQL evolui ao longo do tempo, devido ao qual algumas coisas são alteradas com base em melhorias futuras do produto.
No entanto, tenho outro relatório de bug relacionado à
NOW()
funçãoO campo data e hora não aceita o padrão AGORA ()
Outra observação útil [consulte Inicialização e atualização automática para TIMESTAMP e DATETIME ]
Atualização sobre NO_ZERO_DATE
A partir do MySQL a partir de 5.7.4, esse modo está obsoleto. Para a versão anterior, você deve comentar a linha respectiva no arquivo de configuração. Consulte a documentação do MySQL 5.7 em NO_ZERO_DATE
fonte
STRICT_TRANS_TABLES
para minhas duas instâncias do MySQL, local e servidor. No entanto, posso inserir facilmente0000-00-00
na minha instância local, mas não na minha instância do servidor - um erro é lançado. Por quê? Porque minha configuração de servidor MySQL foiNO_ZERO_DATE
habilitada. E meu local não tem.NO_ZERO_DATE
deve ser removidoEu tive este erro com WAMP 3.0.6 com MySql 5.7.14.
Solução :
mude a linha 70 (se o seu arquivo ini não foi alterado) no
c:\wamp\bin\mysql\mysql5.7.14\my.ini
arquivo depara
e reinicie todos os serviços.
Isso desativará o modo estrito. De acordo com a documentação, “modo estrito” significa um modo com um ou ambos
STRICT_TRANS_TABLES
ouSTRICT_ALL_TABLES
habilitado. A documentação diz:fonte
Eu entrei em uma situação em que os dados foram misturados entre NULL e 0000-00-00 para um campo de data. Mas eu não sabia como atualizar o '0000-00-00' para NULL, porque
não é mais permitido. Minha solução alternativa foi bastante simples:
porque todos os
my_date_field
valores incorretos (datas corretas ou não) eram anteriores a esta data.fonte
<'0000-01-01'
já que é uma data válida.Problema de sintaxe de configuração
Em algumas versões do MYSQL (testado 5.7. *) Em sistemas * nix, você deve usar esta sintaxe:
Estes não funcionam:
traço sem aspas
sublinhado sem aspas
sublinhado e citações
Uma revisão mais completa dos valores de configuração e do modo sql:
Como configurar sinalizadores de modo SQL permanentes
fonte
Primeiro selecione a sessão atual
sql_mode
:Então você obterá algo parecido com o valor padrão :
e depois definido
sql_mode
sem'NO_ZERO_DATE'
:Se você tiver bolsas, também pode fazer isso por
GLOBAL
:fonte
Basta adicionar a linha:
sql_mode = "NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
dentro do arquivo:
/etc/mysql/mysql.conf.d/mysqld.cnf
então
sudo service mysql restart
fonte
SELECT @@SESSION.sql_mode;
primeiro, e eles removendo NO_ZERO_IN_DATE, NO_ZERO_DATE e STRICT_TRANS_TABLES do que ele oferece. Dessa forma, você mantém todas as outras configurações que ativou. Eu tinha muito mais do que apenas esses dois itens definidos para o meu modo sql. Não sei o que todos eles fazem, mas não quero arriscar removê-los neste momento.Funciona para 5.7.8:
Você pode criar um SQLFiddle para recriar seu problema.
http://sqlfiddle.com/
Se funcionar para MySQL 5.6 e 5.7.8, mas falhar em 5.7.11. Então provavelmente será um bug de regressão para 5.7.11.
fonte
Para resolver o problema com o MySQL Workbench (após aplicar a solução no lado do servidor):
Remova SQL_MODE para TRADITIONAL no painel de preferências.
fonte
Esta resposta é apenas para MySQL 5.7:
Best não é realmente definido em branco no sql_mode, em vez disso, use em PHP uma variável de sessão com:
Portanto, pelo menos você mantém os outros valores padrão.
É uma loucura que a documentação do mysql não esteja clara, você precisa deletar esses valores padrão em sql_mode:
NO_ZERO_IN_DATE, NO_ZERO_DATE, eu entendo, mas nas versões futuras isso será descontinuado.
STRICT_ALL_TABLES, com isso, os parâmetros anteriores serão ignorados, então você precisa excluí-los também.
Finalmente também TRADICIONAL, mas a documentação fala sobre este parâmetro: “dar um erro em vez de um aviso” ao inserir um valor incorreto em uma coluna ", com este parâmetro, datas com valor zero não são inseridas, mas sem sim.
O MySQL não é realmente organizado com esses parâmetros e combinações.
fonte
Combinações de opções para
mysql Ver 14.14 Distrib 5.7.18, for Linux (x86_64)
.Não atira:
STRICT_TRANS_TABLES
+NO_ZERO_DATE
Lança:
STRICT_TRANS_TABLES
+NO_ZERO_IN_DATE
Minhas configurações no
/etc/mysql/my.cnf
Ubuntu:fonte
fonte
Em diretory xamp / mysql / bin Abra "my.ini" e altere a linha: Sql_node para ->
"sql_mode = NO_ENGINE_SUBSTITUTION, NO_ZERO_DATE"
REMOVER "NO_ZERO_IN_DATE"
fonte