Estou trabalhando em alguma otimização de código PHP e, enquanto procuro, encontro algumas instruções SELECT com as seguintes condições:
WHERE `date_exported` = '0000-00-00 00:00:00' OR `date_exported` IS NULL
Isso me faz pensar se a mesma instrução funcionará da mesma forma com apenas uma condição: a comparação com NULL ou a comparação com um datetime "inválido".
Acrescentarei ainda: usando MySQL Workbench e Datagrip (ou o equivalente de ferramentas como PhpStorm) não consigo ver a coluna com NULL
but 0000-00-00 00:00:00
. Não tenho certeza se isso é uma coisa de configuração ou se deveria ser assim.
Este é o MySQL 5.7 e não tenho permissão para verificar itens de configuração ou insights sobre como esta instância está configurada.
Tentei definir um playground aqui , mas não me permite adicionar uma coluna 0000-00-00 00:00:00
NULLdatetime
O SQL_MODE
é definido da seguinte forma:
NO_ZERO,IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Nota: é 0000-00-00 00:00:00
inválido?
Por favor, forneça
SHOW VARIABLES LIKE "SQL_MODE";
e procureNO_ZERO_DATE
.Seria mais eficiente evitar
OR
.Considere "consertar" os dados durante o
INSERTs
. Isso evita a necessidade de incomodá-lo duranteSELECTs
.Como o padrão é
NO_ZERO_DATE
, recomendo mover nessa direção. cf https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_show_old_temporalsNão tenho os detalhes dessa mudança de "data_zero", então não posso dizer onde 5,7 se encaixa no espectro.
Não sei se você consegue fazer (1 coluna por vez).
e da mesma forma para qualquer data e hora.
Tentei usar algo como seu WHERE .. OR .., mas consegui
ERROR 1525 (HY000): Incorrect DATE value: '0000-00-00'
. Mas então euNO_ZERO_DATE
defini.Espero ter apontado a direção certa; desculpe não ter a resposta completa.
Não, a mesma afirmação não funcionará para ambos os casos.
null
é um valor desconhecido, enquanto0000-00-00 00:00:00
é um valor conhecido.Nulo só pode ser avaliado usando
is/is not null
, enquanto0000-00-00 00:00:00
pode ser avaliado usando=
,<>
..etc.Dos tipos DATE, DATETIME e TIMESTAMP
Eu diria que é inválido, talvez represente um valor desconhecido que seria melhor usar null.
O que sugiro para um melhor desempenho?
Altere a estrutura da tabela para o seguinte e atualize os valores.
Mantenha um backup antes de usar o método a seguir.
Se você estiver usando o mecanismo de armazenamento InnoDB, use
Na consulta mantenha apenas a seguinte condição, um índice ativado
date_exported
é suficiente.consultar exemplo