definir sql_mode global no mysql

94

Estou tentando definir sql_mode no mysql, mas gera um erro.

Comando:

set global sql_mode='NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLE','NO_AUTO_CREATE_USER','NO_ENGINE_SUBSTITUTION'

Esta não é a maneira correta de definir vários modos? Quais são as vantagens de definir modos de sessão e globais? o que é preferido? Tenho diferentes usuários tentando atualizar o banco de dados com diferentes valores UNC e, em vez disso, definindo o modo de sessão como 'NO_BACKSLASH_ESCAPES', achei que faria sentido definir um modo global para isso. Isso faz sentido?

Por favor deixe-me saber.

Obrigado.

JPro
fonte
Essas citações erradas realmente me incomodam; p. Como outros disseram, tenho certeza, isso definitivamente não está certo apenas por causa disso.
dyasta

Respostas:

211

BTW, se você definir globais no MySQL:

SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';
SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION';

Isso não o definirá PERMANENTEMENTE e será revertido após cada reinicialização.

Portanto, você deve definir isso em seu arquivo de configuração (por exemplo, /etc/mysql/my.cnfna seção [mysqld]), para que as alterações permaneçam em vigor após a reinicialização do MySQL:

Arquivo de configuração: /etc/mysql/my.cnf

[mysqld] 
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

ATUALIZAÇÃO: versões mais recentes do Mysql (por exemplo, 5.7.8 ou superior) podem exigir uma sintaxe ligeiramente diferente:

[mysqld]
sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"

Certifique-se de que haja um traço entre sql-modenão sublinhado e que os modos estejam entre aspas duplas.

Sempre consulte os documentos do MySQL de sua versão para ver as opções do modo sql .

Chadwick Meyer
fonte
2
Obrigado, definir em my.cnf funcionou para mim. Para os interessados, esta página informa quais são os sql_modes padrão em 5.7 e acima: dev.mysql.com/doc/refman/5.7/en/sql-mode.html
Richard
2
Nota da versão 5.7! Esse era o problema.
Ernestas Stankevičius
Em um aplicativo da web real, a segunda consulta funciona. Acabei de adicionar outra consulta após a consulta de conexão mysqli. SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION'; Obrigado Chad!
GTodorov
1
Em 5.7.20, e no caso de mysql.ini, usar um sublinhado e esquecer as aspas funciona muito bem, como:sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
Ifedi Okonkwo
32

Eu resolvi isso.

o modo correto é:

set global sql_mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
JPro
fonte
17
AVISO: Em nossa experiência, isso não mantém a configuração após uma reinicialização do MySQL ...
Chadwick Meyer
1
Sim, isso não mantém as configurações após o reinício
prakashpoudel
4
Para retê-lo após a reinicialização do unix, tive que criar um arquivo ~ / .my.cnf e adicionar [mysqld] sql_mode = "<novo modo>". Espero que isso ajude
Raman Singh
28

Configurando o modo sql permanentemente usando o arquivo de configuração mysql.

No meu caso, preciso alterar o arquivo /etc/mysql/mysql.conf.d/mysqld.cnfconforme mysql.conf.dincluído em /etc/mysql/my.cnf. eu mudo isso em [mysqld]

[mysqld]
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

apenas removido ONLY_FULL_GROUP_BY modo sql porque estava causando o problema.

Eu estou usando ubuntu 16.04, php 7e mysql --version me dê issomysql Ver 14.14 Distrib 5.7.13, for Linux (x86_64) using EditLine wrapper

Após esta mudança, execute os comandos abaixo

sudo service mysql stop
sudo service mysql start

Agora verifique os modos sql por esta consulta SELECT @@sql_modee você deve obter os modos que acabou de definir.

Yashrajsinh Jadeja
fonte
15

Copiar para arquivo de configuração: /etc/mysql/my.cnf OR /bin/mysql/my.ini

[mysqld]
port = 3306
sql-mode=""

MySQL reiniciar.

Ou você também pode fazer

[mysqld]
port = 3306
SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";

MySQL reiniciar.

Devraj Gupta
fonte
2
Eu acho que é em sql_modevez de sql-mode.
Raman Sahasi
14

Para quem está pesquisando esse erro no Google para MySQL 8.

O MySQL 8.0.11 remove o 'NO_AUTO_CREATE_USER' do modo sql.

MySQL 5.7: Usando GRANT para criar usuários. Em vez disso, use CREATE USER. Seguir essa prática torna o modo NO_AUTO_CREATE_USER SQL irrelevante para instruções GRANT, portanto, ele também está obsoleto. MySQL 8.0.11: Usando GRANT para criar usuários. Em vez disso, use CREATE USER. Seguir esta prática torna o modo NO_AUTO_CREATE_USER SQL irrelevante para instruções GRANT, portanto, ele também é removido.

Retirado daqui

Então, você sql_modepode ser assim:

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

Ou se estiver usando o Docker, você pode adicionar o próximo comando a docker-compose.yml

  mysql:
    image: mysql:8.0.13
    command: --sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
    ports:
      - 13306:${MYSQL_PORT}
Serhii Popov
fonte
4

Para mudança temporária, use o seguinte comando

set global sql_mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 

Para mudanças permanentes: vá para o arquivo de configuração /etc/my.cnf ou /etc/mysql/mysql.conf.d/mysqld.cnf e adicione as seguintes linhas e reinicie o serviço mysql

[mysqld]
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
Vineet Kumar
fonte
3

Acesse o banco de dados como usuário administrador (root, talvez).

Verifique o SQL_mode atual

mysql> SELECT @@sql_mode;

Para definir um novo sql_mode, saia do banco de dados, crie um arquivo

nano /etc/mysql/conf.d/<filename>.cnf 

com o seu conteúdo sql_mode

[mysqld]
sql_mode=NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Reinicie o Mysql

mysql> sudo service mysql stop
mysql> sudo service mysql start

Criamos um arquivo na pasta /etc/mysql/conf.d/ porque no arquivo de configuração principal /etc/mysql/my.cnf o comando é escrito para incluir todos os arquivos de configuração da pasta / etc / mysql / conf. d /

Eric Korolev
fonte
2

Verifique a documentação do sql_mode

Método 1:

Verifique o valor padrão de sql_mode:

SELECT @@sql_mode //check current value for sql_mode

SET GLOBAL sql_mode = "NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";

Método 2:

Acesse o phpmyadmin para editar o seu sql_mode

  • Faça login no phpmyadmin e abra o localhost
  • Em cima Variáveis presentes no topo nos itens do menu e procure o modo sql
  • Clique no botão editar para modificar sql_mode com base em seus requisitos
  • Salve as alterações

configurações do modo sql no phpmyadmin

Reinicie o servidor depois de executar as coisas acima

Ankit Jindal
fonte
1

No meu caso, tenho que alterar o arquivo, /etc/mysql/mysql.conf.d/mysqld.cnfaltere isso em [mysqld ]

Cole esta linha na mysqldparte [ ]

sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
shashikant parmar
fonte
1

Eu só tive um problema semelhante onde o MySQL (5.6.45) não aceitava sql_mode de qualquer arquivo de configuração.

A solução foi adicionar init_file = /etc/mysql/mysql-init.sqlao arquivo de configuração e executar SET GLOBAL sql_mode = '';nele.

Cobra_Fast
fonte
1

No meu caso mysql e ubuntu 18.04

Eu o defino permanentemente usando este comando

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Acrescente a linha após a configuração. Veja o exemplo destacado na imagem abaixo.

sql_mode = ""

Nota: Você também pode adicionar modos diferentes aqui, depende de sua necessidade NO_BACKSLASH_ESCAPES, STRICT_TRANS_TABLE, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION

Consulte a documentação e a referência dos modos sql disponíveis

adicionando modo sql

Em seguida, salve. Depois de salvar, você precisa reiniciar o serviço mysql, siga o comando abaixo:

sudo service mysql restart

Espero que isto ajude :-)

Cristiana chavez
fonte
0

Se alguém quiser configurá-lo apenas para a sessão atual, use o seguinte comando

set session sql_mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
ASHOK MANGHAT
fonte
-3
definir sql_mode global = "NO_BACKSLASH_ESCAPES, STRICT_TRANS_TABLE, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION"
Shadab Khan Zed
fonte