Desativar ONLY_FULL_GROUP_BY

615

Ativei acidentalmente o modo ONLY_FULL_GROUP_BY assim:

SET sql_mode = 'ONLY_FULL_GROUP_BY';

Como faço para desativá-lo?

ZviBar
fonte
39
Você já tentou SET sql_mode = ''?
Tripp Kinetics
4
Por que você deseja desativar um modo que torne o MySQL melhor em conformidade com os padrões SQL e outro que ensina a ser mais cuidadoso ao escrever suas consultas?
Andriy M
34
A partir do Mysql 5.7, você pode, alternativamente, usar a columnfunção ANY_VALUE ( ) para atualizar sua consulta. Veja doc aqui
Qoheleth-Tech
3
@AndriyM Vou precisar usar isso em breve, porque estou transportando toda uma carga de aplicativos antigos para um novo servidor e eles precisam funcionar, se eu tenho a fonte ou não.
21716 Jaydee
8
@AndriyM Porque se eu estiver agrupando por uma coluna de índice exclusiva, JÁ sei que cada linha será única - adicionando um grupo separado por comando para cada. solteiro. coluna. na mesa há uma dor real.
Benubird

Respostas:

1163

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

  • Abra o phpmyadmin e selecione localhost
  • Clique no menu Variáveis ​​e role para baixo para o modo sql
  • Clique no botão editar para alterar os valores e remover ONLY_FULL_GROUP_BY e clique em salvar. insira a descrição da imagem aqui
Eyo Okon Eyo
fonte
12
Esta solução funciona bem no mySQL 5.7.11 e deve ser a aceita. A resposta aceita não funciona na nova versão do mySQL
Anyone_ph 14/04/16
4
Apenas garantido. Não importa REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''), o MySQL remove as vírgulas indesejadas do registro. A resposta do OP está correta.
Nawfal # 21/16
40
Isso funciona, mas quando eu reinicio o servidor mysql, os padrões são restaurados ... por quê? existe uma solução persistente? Obrigado!
Vincent Pazeller 16/11
52
Para responder à minha pergunta (solução persistente): você deve colocar a descrição do sql_mode dentro de um arquivo my.cnf (/etc/my.cnf, por exemplo) e reiniciar o servidor. Por exemplo, inserção (abaixo da secção [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"
Vincent Pazeller
21
GLOBALnão funcionou para mim, mas SESSIONfuncionou. SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
Andre Andre
371

Atualizar:

insira a descrição da imagem aqui

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.iniarquivo.

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

Cuidado! copy_meO 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:

  1. sudo nano /etc/mysql/my.cnf
  2. 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"
  3. sudo service mysql restart reiniciar o MySQL

Isso será desativado ONLY_FULL_GROUP_BYpara TODOS os usuários

breq
fonte
2
para mim, a definição da tag mysqld na mesma linha não funcionou, mas é fez um trabalho com uma linha de quebra :) Obrigado
bloub
23
Para o Ubuntu, o arquivo onde os valores de configuração personalizados ir é/etc/mysql/mysql.conf.d/mysqld.cnf
knb
5
Isso funcionou para o Ubuntu 16.04 (14 a 16 problemas de atualização ..). O /etc/mysql/my.cnf é o arquivo correto. O arquivo mencionado pelo knb está incluído neste arquivo my.cnf, pelo menos em 16.04 (a configuração agora está dividida em vários arquivos).
jwinn
2
Use "SELECT @@ sql_mode;" para ver quais modos estão ativados no momento antes de fazer alterações.
Zbigniew Ledwoń
1
o local real em que você verá [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" *
Oliver Williams
203

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_BYopção

Taran
fonte
Qual é a melhor maneira de fazer isso then SET it to this list without the ONLY_FULL_GROUP_BY option.:?
Kevin Meredith
4
@KevinMeredith minha leitura dos docs é que não há maneira de transformar um modo on / off de cada vez - todos os exemplos requerem que você fornecer uma lista separada por vírgulas dos que você quiser - por exemploSET sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
William Turrell
1
Se for uma alteração permanente, edite my.cnf com uma linha como esta : 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.
blackwood
107

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.

Cinética Tripp
fonte
11
Uau, ''= 'full group by is disabled'? O MySQL faz algumas coisas bem idiotas, mas essa está lá em cima.
Aaron Bertrand
38
Eu acho que isso basicamente desativa qualquer modo sql;
ZviBar 28/05
Isso não funcionou para mim. Vejo 0 rows affectede minha consulta ainda não funciona:Error Code: 1055. Expression #6 of SELECT list is not in GROUP BY clause and contains nonaggregated column ...
Max Heiber
10
Antes de tentar esta resposta, definitivamente olhar para o aviso do Machavity e se você quiser que as alterações persistirem, certifique-se de uso globalno comando .
Thomas88wp
6
Toda vez que volto ao MySql depois de algum tempo, sempre encontro esse problema que me incomoda, porque sempre esqueço qual é o problema :) O sentimento é decepcionante quando você pensa que estava funcionando e agora não funciona. por causa da mudança de versão.
X-HuMan
106
    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;
WeiYuan
fonte
@ RémiBreton: qual é a sua versão mysql?
27516 WeiYuan
6
Isso realmente funciona. Mas depois de reiniciar meu sistema (ubuntu 16.04), a sql_modereversão para o valor anterior. O que eu posso fazer agora?
pktangyue
incrível, funcionou para mim, assim que eu preciso para converter isso em permanente
Fernando Torres
74

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_BYmodo, 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

Janaka R Rajapaksha
fonte
Esta é uma ótima resposta! Obrigado.
wedi
1
Isso é global ou está na conexão atual? Ótima resposta!
Oliver M Grech
48

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.

Arvid
fonte
1
E se for necessário combinar com SET NAMES 'utf8', use o seguinte "SET NAMES 'utf8', sql_mode = (SELECT REPLACE (@@ sql_mode, 'ONLY_FULL_GROUP_BY', ''));". Se, em vez disso, forem usadas duas consultas como "SET NAMES 'utf8'; SET sql_mod ...", será exibido "Erro geral: 2014 Não é possível executar consultas enquanto outras consultas não armazenadas em buffer estão ativas".
Ventzy Kunev
@VentzyKunev, por favor, não siga este conselho e não o defina SET NAMESusando 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
LPodolski
39

Em:

  • Ubuntu 14.04
  • mysql Ver 14.14 Distrib 5.7.16, para Linux (x86_64) usando o wrapper EditLine

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
Jadeye
fonte
O mysql.cnf nunca será substituído por uma atualização do mysql?
cwhisperer
1
@cwhisperer /etc/mysql/mysql.cnfaponta 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
Jadeye 08/11/16
Eu tentei isso e não funcionou no Ubuntu 18.04.2 biônico. Eu segui este e funcionou: sitepoint.com/... - talvez é importante usar este formato com espaços e citações: 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.cnfem vez
rubo77
Isso funciona mesmo após a reinicialização do servidor mysql
Akshay Khale
36

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

Waqleh
fonte
3
-Se deANY_VALUE()
Sithu
25

A documentação do MySQL também especifica os seguintes métodos:

  • Defina sql-mode="<modes>"em um arquivo de opções como my.cnf (sistemas operacionais Unix) ou my.ini (Windows).
  • Para definir o modo SQL na inicialização do servidor por meio da linha de comando, use a --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.cnfe 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.

br3nt
fonte
1
esta é a resposta correta para mim `Ver 14.14 Distrib 5.7.10, para osx10.11 (x86_64)`
Sinux 8/16
isso deve ser marcado como a resposta correta. As outras respostas não fornecem uma solução permanente.
Sjpkes
@ br3nt Como detecto quais são os modos atuais utilizados para remover os modos indesejados, caso não queira desabilitar todos os modos?
simgineer 8/01
1
TenteSELECT @@GLOBAL.sql_mode;
br3nt
19

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

Finalizar esta imagem

Shiran Gabriel
fonte
Existe uma razão para eu não ter as configurações do MySQL na minha instalação do WAMP? Há administração de serviço e console do MySQL, mas nenhuma configuração?
Craig
Era exatamente isso que eu estava procurando! Obrigado por fornecer uma solução simples para servidor WAMP! Eu precisava disso enquanto tentava fazer #agregação neste tutorial: youtu.be/HXV3zeQKqGY?t=9718
Eric Hepperle - CodeSlayer2010
12

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 +

referência do mysql 5.6

Salvatore Napoli
fonte
Outras respostas afirmam sql_mode := ''ser possíveis. Por que você discorda?
Hermann Döppes
De onde vêm todas essas opções na sua string? Qual é o raciocínio por trás disso?
Hermann Döppes
De acordo com a documentação do MySQL 5.6, sql_mode é o padrão é uma string em branco no MySQL 5.6.5 e vice-versa NO_ENGINE_SUBSTITUTION, STRICT_TRANS_TABLES em 5.6.6 dev.mysql.com/doc/refman/5.6/en/…
Salvatore Napoli
Graças trabalhou para mim no Ubuntu 16.04 - mysql Ver 14,14 Distrib 5.7.18, para Linux (x86_64), utilizando invólucro editline
Paul Preibisch
12

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á!

Alexandre Ribeiro
fonte
1
Eu recomendaria fortemente a abordagem acima mencionada do que defini-la na sessão, graças a @ alexandre-ribeiro. Para quem possui o Ubuntu 16.04 e o mysql 5.7.x, edite melhor o arquivo e insira a diretiva ini sql_mode = <os modos> no grupo [mysqld] , pois declarar contra o [mysql] não funciona, conforme minha experiência.
Codornada #
Eu tenho o MySQL 5.7.22. É estranho, mas eu tinha que remover tanto STRICT_TRANS_TABLES e ONLY_FULL_GROUP_BY da declaração sql_mode em my.cnf, como mostrado acima, para que isso funcione. Na realidade, eu só quero remover o modo ONLY_FULL_GROUP_BY. Se eu definir "global / session sql_mode = ...", posso remover apenas ONLY_FULL_GROUP_BY sem precisar remover STRICT_TRANS_TABLES para que funcione. Mas como isso não sobrevive, as reinicializações não são muito úteis para mim.
Raych
12

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'
Matt Vegas
fonte
10

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+xe yeEnter

Nota: Pode ser necessário atualizarmysql-5.7.24-macos10.14-x86_64esses comandos, basta verificar o nome da pasta correta que você possui/usr/local/

Espero que ajude alguém!

AamirR
fonte
10

Adicionar ou remover modos para sql_mode

MySQL 5.7.9 ou posterior

Para adicionar ou remover um modo sql_mode, você pode usar list_adde list_dropfunçõ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_modeque 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_modevalor é 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_modevariá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_modevariá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 GLOBALvariável não se propaga para a SESSIONvariável até que uma nova conexão seja estabelecida.

A GLOBALvariável persistirá até que o serviço em execução seja reiniciado.

A SESSIONvariável persistirá para a conexão atual, até que a conexão seja fechada e uma nova conexão seja estabelecida.


Reverter para GLOBAL.sql_mode

Como SET sql_mode = 'ONLY_FULL_GROUP_BY';foi executada sem o GLOBALmodificador, a alteração afetou apenas o SESSIONvalor 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 SESSIONvalor atual é válido apenas para a conexão atual. Reconectar-se ao servidor reverterá o valor novamente para o GLOBAL 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_modevalor 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_modevalor para o GLOBAL.sql_modevalor

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 |
+----------------------------------------------+----------------------------------------------+

Reinicialização do servidor persistente sql_mode

Para definir o modo SQL na inicialização do servidor, use a --sql-mode="modes"opção na linha de comandos ou sql-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_modeValores padrão

Como 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

''
fyrye
fonte
8

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.cnfe 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
Hiren Bhut
fonte
até agora esta resposta trabalha para 8.0.13
tomexsans
7

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.

cwhisperer
fonte
3
Usando a notação yaml para configurar o Doctrine (como feito no Symfony), você precisa usar "1002" em vez da constante "PDO :: MYSQL_ATTR_INIT_COMMAND", mas mesmo assim é isso que eu procurava há algumas semanas e não consegui encontrar Fora. Obrigado pela sua solução! Trabalhou para mim.
Arvid
5

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)

  1. Digite WHM como root e execute phpMyAdmin

  2. 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
  1. Conecte-se ao seu servidor via SFTP - SSH (root) e faça o download do arquivo /etc/my.cnf

  2. Abra com um my.cnfarquivo 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
  1. Salve o my.cnfarquivo e faça o upload novamente para/etc/

  2. Digite WHM e vá para "WHM> Reiniciar Serviços> SQL Server (MySQL)" e reinicie o serviço

Marco Demaio
fonte
4

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', ''));

Jorge Santos Neill
fonte
3

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.

demisx
fonte
1

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_modeaqui:

# 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"
Dio Phung
fonte
1

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.

Marcello Perri
fonte
0

com o MySQL versão 5.7.28, verifique
SELECT @@sql_mode; e atualize com

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'
Karthik
fonte