Ativei acidentalmente o modo ONLY_FULL_GROUP_BY assim:
SET sql_mode = 'ONLY_FULL_GROUP_BY';
Como faço para desativá-lo?
column
função ANY_VALUE ( ) para atualizar sua consulta. Veja doc aqui
Ativei acidentalmente o modo ONLY_FULL_GROUP_BY assim:
SET sql_mode = 'ONLY_FULL_GROUP_BY';
Como faço para desativá-lo?
column
função ANY_VALUE ( ) para atualizar sua consulta. Veja doc aqui
Respostas:
Solução 1: Remova o ONLY_FULL_GROUP_BY do console mysql
mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
você pode ler mais aqui
Solução 2: Remova o ONLY_FULL_GROUP_BY do phpmyadmin
REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')
, o MySQL remove as vírgulas indesejadas do registro. A resposta do OP está correta.
GLOBAL
não funcionou para mim, mas SESSION
funcionou. SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Para manter suas configurações atuais do mysql e desativar ONLY_FULL_GROUP_BY
, sugiro visitar seu phpmyadmin ou qualquer outro cliente que você esteja usando e digite:
SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','') copy_me
próximo resultado da cópia para o seu my.ini
arquivo.
hortelã :sudo nano /etc/mysql/my.cnf
Ubuntu 16 e superior :sudo nano /etc/mysql/my.cnf
ubuntu 14-16 :/etc/mysql/mysql.conf.d/mysqld.cnf
copy_me
O resultado pode conter um texto longo que pode ser aparado por padrão. Certifique-se de copiar o texto inteiro!resposta antiga:
Se você deseja desativar o erro permanentemente "A expressão nº N da lista SELECT não está na cláusula GROUP BY e contém a coluna não agregada 'db.table.COL', que não depende funcionalmente das colunas da cláusula GROUP BY; isso é incompatível com sql_mode = only_full_group_by "execute essas etapas:
sudo nano /etc/mysql/my.cnf
Adicione isso ao final do arquivo
[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"
sudo service mysql restart
reiniciar o MySQL
Isso será desativado ONLY_FULL_GROUP_BY
para TODOS os usuários
/etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
talvez não esteja nesse arquivo, ele pode estar em um diretório de inclusão. Use este comando primeiro: grep -R "\[mysqld\]" *
para ver o que há - e, nesse caso, tentegrep -R "\bsql_mode\b" *
Cuidado ao usar
SET sql_mode = ''
Na verdade, isso limpa todos os modos atualmente ativados. Se você não quiser mexer com outras configurações, faça uma
SELECT @@sql_mode
primeiro, para ativar uma lista separada por vírgula dos modos, em seguida, defina-a nesta lista sem a ONLY_FULL_GROUP_BY
opção
then SET it to this list without the ONLY_FULL_GROUP_BY option.
:?
SET sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
sql_mode=<comma-separated-list>
, pare e inicie o servidor. Siga os documentos do seu sistema operacional para obter a localização e a melhor maneira de editar o my.cnf.
Faça uma tentativa:
SET sql_mode = ''
Nota da comunidade: Conforme indicado nas respostas abaixo, na verdade, ele limpa todos os modos SQL ativados no momento. Isso pode não ser necessariamente o que você deseja.
''
= 'full group by is disabled'
? O MySQL faz algumas coisas bem idiotas, mas essa está lá em cima.
0 rows affected
e minha consulta ainda não funciona:Error Code: 1055. Expression #6 of SELECT list is not in GROUP BY clause and contains nonaggregated column ...
global
no comando .
mysql> set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
mysql> set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
mysql> exit;
sql_mode
reversão para o valor anterior. O que eu posso fazer agora?
Adicionando apenas um modo ao sql_mode sem remover os existentes:
SET sql_mode=(SELECT CONCAT(@@sql_mode,',<mode_to_add>'));
Removendo apenas um modo específico do sql_mode sem remover outros:
SET sql_mode=(SELECT REPLACE(@@sql_mode,'<mode_to_remove>',''));
No seu caso, se você deseja remover apenas o ONLY_FULL_GROUP_BY
modo, use o comando abaixo:
SET sql_mode=(SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));
Referência: http://johnemb.blogspot.com/2014/09/adding-or-removing-individual-sql-modes.html
Graças a @cwhisperer. Eu tive o mesmo problema com o Doctrine em um aplicativo Symfony. Acabei de adicionar a opção ao meu config.yml:
doctrine:
dbal:
driver: pdo_mysql
options:
# PDO::MYSQL_ATTR_INIT_COMMAND
1002: "SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))"
Isso funcionou bem pra mim.
SET NAMES
usando esse método, na maioria dos casos não é necessário o symfony já o configurou via doctrine.dbal.charset cofnig: symfony.com/doc/current/reference/configuration/doctrine.html , e fá-lo corretamente via PDO dns, nomes conjunto é meio ultrapassada de fazer isso, que não deve ser usado para PHP versão maior do que 5,3
Em:
Faz:
$ sudo nano /etc/mysql/conf.d/mysql.cnf
Copiar e colar:
[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
Na parte inferior do arquivo
$ sudo service mysql restart
/etc/mysql/mysql.cnf
aponta para 2 pastas de configuração !includedir /etc/mysql/conf.d/
+ !includedir /etc/mysql/mysql.conf.d/
. O mesmo vale para /etc/mysql/my.cnf
. Portanto, presumo que os arquivos de configuração não sejam substituídos na atualização. Você pode ler mais aquihttp://dev.mysql.com/doc/mysql/en/server-system-variables.html
sql_mode = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
talvez seja importante para criar um novo arquivo /etc/mysql/mysql.conf.d/mysqld_mode.cnf
em vez
Percebi que a solução @Eyo Okon Eyo funciona enquanto o servidor MySQL não for reiniciado, e as configurações padrão serão restauradas. Aqui está uma solução permanente que funcionou para mim:
Para remover o modo SQL específico (neste caso, ONLY_FULL_GROUP_BY ), localize o modo SQL atual:
SELECT @@GLOBAL.sql_mode;
copie o resultado e remova dele o que você não precisa ( ONLY_FULL_GROUP_BY )
por exemplo:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
para
STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
crie e abra este arquivo:
/etc/mysql/conf.d/disable_strict_mode.cnf
e escreva e cole nele seu novo modo SQL:
[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
reinicie o MySQL:
sudo service mysql restart
Ou você pode usar ANY_VALUE()
para suprimir a rejeição do valor ONLY_FULL_GROUP_BY, você pode ler mais sobre isso aqui
ANY_VALUE()
A documentação do MySQL também especifica os seguintes métodos:
sql-mode="<modes>"
em um arquivo de opções como my.cnf (sistemas operacionais Unix) ou my.ini (Windows).--sql-mode="<modes>"
opção* Onde <modes>
está uma lista de modos diferentes separados por vírgulas.
Para limpar o modo SQL explicitamente, defina-o como uma cadeia vazia usando --sql-mode=""
na linha de comando ou sql-mode=""
em um arquivo de opções.
Eu adicionei a sql-mode=""
opção /etc/my.cnf
e funcionou.
Esta solução SO discute maneiras de descobrir qual arquivo my.cnf está sendo usado pelo MySQL.
Não se esqueça de reiniciar o MySQL após fazer alterações.
SELECT @@GLOBAL.sql_mode;
Se você estiver usando o WAMP. Clique com o botão esquerdo no ícone WAMP e vá para MySQL -> MySQL settings -> sql-mode e selecione sql-mode-> user mode
No meu sql (versão 5.7.11 executando no Mac OS X), este trabalho para mim no cliente shell mysql:
SET
@@GLOBAL.sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
De acordo com a documentação do MySQL 5.6, sql_mode é o padrão é
string em branco no MySQL 5.6.5 e vice-versa NO_ENGINE_SUBSTITUTION, STRICT_TRANS_TABLES no 5.6.6 +
sql_mode := ''
ser possíveis. Por que você discorda?
No MySQL 5.7 e Ubuntu 16.04, edite o arquivo mysql.cnf.
$ sudo nano /etc/mysql/conf.d/mysql.cnf
Inclua o sql_mode como o seguinte e salve o arquivo.
[mysql]
sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Observe que, no meu caso, removi o modo STRICT_TRANS_TABLES e o ONLY_FULL_GROUP_BY.
Fazendo isso, ele salvará a configuração do modo permanentemente. Diferentemente, se você acabou de atualizar o @@ sql_mode através do MySQL, porque ele será redefinido na reinicialização da máquina / serviço.
Depois disso, para a configuração modificada entrar em ação, reinicie o serviço mysql:
$ sudo service mysql restart
Tente acessar o mysql:
$ mysql -u user_name -p
Se você conseguir fazer login e acessar o console do MySQL, tudo bem. Ótimo!
MAS , se como eu, você enfrentará o erro "variável desconhecida sql_mode" , que indica que sql_mode é uma opção para o mysqld , você precisará voltar, editar o arquivo mysql.cnf novamente e alterar [mysql]
para [mysqld]
. Reinicie o serviço MySQL e faça um último teste tentando efetuar login no console do MySQL. Aqui está!
Isto é o que eu executei para corrigir no ambiente de trabalho Mysql:
Antes de eu obter o valor atual com o comando abaixo
SELECT @@sql_mode
depois removi a chave ONLY_FULL_GROUP_BY da lista e colei o comando abaixo
SET sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
Para Mac OS Mojave (10.14) Terminal aberto
$ sudo mkdir /usr/local/mysql-5.7.24-macos10.14-x86_64/etc
$ cd /usr/local/mysql-5.7.24-macos10.14-x86_64/etc
$ sudo nano my.cnf
Cole o seguinte:
[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
Shortkeys a Save & Exit nano: Ctrl+x
e y
eEnter
Nota: Pode ser necessário atualizarmysql-5.7.24-macos10.14-x86_64
esses comandos, basta verificar o nome da pasta correta que você possui/usr/local/
Espero que ajude alguém!
sql_mode
MySQL 5.7.9 ou posterior
Para adicionar ou remover um modo sql_mode
, você pode usar list_add
e list_drop
funções.
Para remover um modo da atual SESSION.sql_mode
, você pode usar um dos seguintes:
SET SESSION sql_mode = sys.list_drop(@@SESSION.sql_mode, 'ONLY_FULL_GROUP_BY');
SET sql_mode = sys.list_drop(@@sql_mode, 'ONLY_FULL_GROUP_BY');
SET @@sql_mode = sys.list_drop(@@sql_mode, 'ONLY_FULL_GROUP_BY');
Para remover um modo do GLOBAL.sql_mode
que persiste para a operação de tempo de execução atual , até que o serviço seja reiniciado .
SET GLOBAL sql_mode = sys.list_drop(@@GLOBAL.sql_mode, 'ONLY_FULL_GROUP_BY');
MySQL 5.7.8 ou anterior
Como o sql_mode
valor é uma sequência de modos CSV, você precisará garantir que a sequência não contenha vírgulas residuais, o que pode ser realizado usando TRIM(BOTH ',' FROM ...)
.
Para remover um modo da sql_mode
variável, convém usar REPLACE()
junto TRIM()
para garantir que as vírgulas residuais sejam removidas.
SET SESSION sql_mode = TRIM(BOTH ',' FROM REPLACE(@@SESSION.sql_mode, 'ONLY_FULL_GROUP_BY', ''));
SET GLOBAL sql_mode = TRIM(BOTH ',' FROM REPLACE(@@GLOBAL.sql_mode, 'ONLY_FULL_GROUP_BY', ''));
Para adicionar um modo à sql_mode
variável, você gostaria de usá-lo CONCAT_WS(',', ...)
, para garantir que uma vírgula seja anexada aos modos atuais e TRIM()
para remover as vírgulas residuais.
SET SESSION sql_mode = TRIM(BOTH ',' FROM CONCAT_WS(',', 'ONLY_FULL_GROUP_BY', @@SESSION.sql_mode));
SET GLOBAL sql_mode = TRIM(BOTH ',' FROM CONCAT_WS(',', 'ONLY_FULL_GROUP_BY', @@GLOBAL.sql_mode));
NOTA: A alteração da
GLOBAL
variável não se propaga para aSESSION
variável até que uma nova conexão seja estabelecida.A
GLOBAL
variável persistirá até que o serviço em execução seja reiniciado.A
SESSION
variável persistirá para a conexão atual, até que a conexão seja fechada e uma nova conexão seja estabelecida.
GLOBAL.sql_mode
Como SET sql_mode = 'ONLY_FULL_GROUP_BY';
foi executada sem o GLOBAL
modificador, a alteração afetou apenas o SESSION
valor do estado atual , que também pertence @@sql_mode
. Para removê-lo e reverter para o padrão global no valor de reinicialização do servidor , convém usar o valor de @@GLOBAL.sql_mode
. [sic]
O
SESSION
valor atual é válido apenas para a conexão atual. Reconectar-se ao servidor reverterá o valor novamente para oGLOBAL
valor.
Para reverter o valor atual do estado da sessão para o valor global atual, você pode usar um dos seguintes:
SET SESSION sql_mode = @@GLOBAL.sql_mode;
SET @@sql_mode = @@GLOBAL.sql_mode;
SET sql_mode = @@GLOBAL.sql_mode;
Mude o SESSION.sql_mode
valor paraONLY_FULL_GROUP_BY
SET sql_mode = 'ONLY_FULL_GROUP_BY';
SELECT @@sql_mode, @@GLOBAL.sql_mode;
+--------------------+----------------------------------------------+
| @@sql_mode | @@GLOBAL.sql_mode |
+--------------------+----------------------------------------------+
| ONLY_FULL_GROUP_BY | NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION |
+--------------------+----------------------------------------------+
Reverta o SESSION.sql_mode
valor para o GLOBAL.sql_mode
valor
SET sql_mode = @@GLOBAL.sql_mode;
SELECT @@sql_mode, @@GLOBAL.sql_mode;
+----------------------------------------------+----------------------------------------------+
| @@sql_mode | @@GLOBAL.sql_mode |
+----------------------------------------------+----------------------------------------------+
| NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION | NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION |
+----------------------------------------------+----------------------------------------------+
sql_mode
Para definir o modo SQL na inicialização do servidor, use a
--sql-mode="modes"
opção na linha de comandos ousql-mode="modes"
em um arquivo de opções como my.cnf (sistemas operacionais Unix) ou my.ini (Windows). [sic]
Por favor, veja sua versão do MySQL para determinar os modos suportados e padrão .
[mysqld]
sql-mode="NO_ENGINE_SUBSTITUTION" #default <= 5.7.4
sql_mode
Valores padrãoComo os valores por versão da documentação do MySQL foram removidos, eu os adicionei aqui para sua referência.
MySQL> = 8.0.11 8.0.5 - 8.0.10 ignorado
ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ZERO_IN_DATE NO_ZERO_DATE ERROR_FOR_DIVISION_BY_ZERO NO_ENGINE_SUBSTITUTION
MySQL> = 5.7.8, <= 8.0.4
ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ZERO_IN_DATE NO_ZERO_DATE ERROR_FOR_DIVISION_BY_ZERO NO_AUTO_CREATE_USER NO_ENGINE_SUBSTITUTION
MySQL 5.7.7
ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_AUTO_CREATE_USER NO_ENGINE_SUBSTITUTION
MySQL> = 5.7.5, <= 5.7.6
ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ENGINE_SUBSTITUTION
MySQL> = 5.6.6, <= 5.7.4
NO_ENGINE_SUBSTITUTION
MySQL <= 5.6.5
''
Se você estiver usando o MySQL 8.0.11, precisará remover o 'NO_AUTO_CREATE_USER' do modo sql.
Adicione a seguinte linha no arquivo /etc/mysql/my.cnf
e no cabeçalho [mysqld]
[mysqld]
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
Estou usando doutrina e adicionei o driverOptions em meu doctrine.local.php:
return array(
'doctrine' => array(
'connection' => array(
'orm_default' => array(
'driverClass' => 'Doctrine\DBAL\Driver\PDOMySql\Driver',
'params' => array(
'host' => 'localhost',
'port' => '3306',
'user' => 'myusr',
'password' => 'mypwd',
'dbname' => 'mydb',
'driverOptions' => array(
PDO::MYSQL_ATTR_INIT_COMMAND => "SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))"
),
),
),
),
));
No phpmyadmin, o usuário precisa do SUPER ativado nos privilégios.
Para quem está executando um VPS / Server com cPanel / WHM , você pode fazer o seguinte para desativar permanentemente ONLY_FULL_GROUP_BY
Você precisa de acesso root (em um servidor VPS ou dedicado)
Digite WHM como root e execute phpMyAdmin
Clique em Variáveis, procure sql_mode
, clique em 'Editar' e copie a linha inteira dentro dessa caixa de texto
por exemplo, copie isto:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Conecte-se ao seu servidor via SFTP - SSH (root) e faça o download do arquivo /etc/my.cnf
Abra com um my.cnf
arquivo de editor de texto no seu PC local e cole nele (na [mysqld]
seção) toda a linha que você copiou na etapa (2), mas removaONLY_FULL_GROUP_BY,
por exemplo, cole isto:
# disabling ONLY_FULL_GROUP_BY
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Salve o my.cnf
arquivo e faça o upload novamente para/etc/
Digite WHM e vá para "WHM> Reiniciar Serviços> SQL Server (MySQL)" e reinicie o serviço
Estou trabalhando com o mysql e registrado com o usuário root, a solução que funciona para mim é a seguinte:
mysql> SET SESSION sql_mode = (SELECT REPLACE (@@ sql_mode, 'ONLY_FULL_GROUP_BY', ''));
Esta é uma solução permanente para o MySql 5.7+ no Ubuntu 14+:
$ sudo bash -c "echo -e \"\nsql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION\" >> /etc/mysql/mysql.conf.d/mysqld.cnf"
$ sudo service mysql restart
# Check if login attempt throws any errors
$ mysql -u[user] -p # replace [user] with your own user name
Se você conseguir fazer o login sem erros - você deve estar pronto agora.
Você pode desativá-lo usando o arquivo de configuração my.cnf
:
$ mysql --verbose --help | grep my.cnf
Então, no macOS 10.12, está em usr/local/etc/my.cnf
. Você pode editar sql_mode
aqui:
# Default Homebrew MySQL server config
[mysqld]
# Only allow connections from localhost
bind-address = 127.0.0.1
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
Aqui está minha solução alterando a configuração do Mysql através do painel phpmyadmin:
Para corrigir "isso é incompatível com sql_mode = only_full_group_by": Abra o phpmyadmin e vá para a Página inicial e selecione o submenu 'Variáveis'. Role para baixo para encontrar o modo sql. Edite o modo sql e remova 'ONLY_FULL_GROUP_BY' Salve-o.
SET sql_mode = ''
?