MySQL permite data zero (0000-00-00 00:00:00) depois que eu habilitei o modo estrito

1

Eu quero configurar uma instância do banco de dados MySQL para não aceitar datas zero (0000-00-00 00:00:00) porque o software que está sendo executado sobre ele não é executado se encontrar tal campo.

O servidor está executando o MySQL versão 5.5.40.

Eu adicionei as seguintes linhas no arquivo my.cnf, na seção [mysqld]:

sql-mode="NO_ZERO_DATE,NO_ZERO_IN_DATE"
innodb_strict_mode="ON"

Após a reinicialização, se eu verificar na linha de comando, recebo o seguinte:

mysql> SELECT @@GLOBAL.sql_mode;
+------------------------------+
| @@GLOBAL.sql_mode            |
+------------------------------+
| NO_ZERO_IN_DATE,NO_ZERO_DATE |
+------------------------------+
1 row in set (0.00 sec)

mysql> SELECT @@GLOBAL.innodb_strict_mode;
+-----------------------------+
| @@GLOBAL.innodb_strict_mode |
+-----------------------------+
|                           1 |
+-----------------------------+
1 row in set (0.00 sec)

Mas se eu me conectar com um aplicativo cliente ao banco de dados e tentar preencher uma data zero, ele ainda funcionará. Tentei recriar o banco de dados, ainda sem sorte. Alguma idéia porque isso é?

Obrigado.

    
por sorin7486 07.01.2015 / 14:56

1 resposta

1

A partir da leitura da documentação sobre os modos do servidor MySQL :

The MySQL server can operate in different SQL modes, and can apply these modes differently for different clients, depending on the value of the sql_mode system variable. DBAs can set the global SQL mode to match site server operating requirements, and each application can set its session SQL mode to its own requirements.

e mais tarde

Setting the GLOBAL variable requires the SUPER privilege and affects the operation of all clients that connect from that time on. Setting the SESSION variable affects only the current client. Each client can change its session sql_mode value at any time

Basicamente, a configuração no arquivo de configuração controla apenas o padrão. Clientes individuais e aplicativos ainda estão livres para fazer o que quiserem, se estiverem dispostos a trabalhar para definir as configurações da sessão. Se você ativar o general_log , poderá realmente assistir a isso, conforme os clientes se conectam e executam consultas.

Como um aparte, acho que a responsabilidade de validar os dados deve estar no código do aplicativo e não no data-store. Você adiciona uma camada fina à estrutura geral do aplicativo, garantindo que INSERTS esteja em conformidade com seus requisitos.

    
por 30.04.2015 / 13:56

Tags