Do not speak Portuguese? Translate this site with Google or Bing Translator
Falha modo SQL ONLY_FULL_GROUP_BY

Posted on: March 05, 2021 07:44 PM

Posted by: Renato

Categories: mysql sql

Views: 4179

Instalei uma versão mais recente do MySQL. Tenho querys que funcionam perfeitamente com a versão anterior e agora tenho muitos erros. ”

Causas mais frequentes desse problema e como resolvê-lo.

Estamos falando sobre este erro:

Você já viu isso?

SQL_MODE

Como primeira coisa, vou apresentar o conceito de SQL_MODE .

O MySQL pode funcionar usando diferentes modos SQL que afetam a sintaxe das consultas e verificações de validação. Com base no valor configurado da variável sql_mode, significa que uma consulta pode ser válida e ser executada regularmente ou pode receber um erro de validação e não pode ser executada.

As versões mais antigas do MySQL acostumaram os usuários a escrever consultas que não eram semanticamente corretas porque foi projetado para funcionar no “modo indulgente”. Os usuários podem escrever qualquer tipo de consulta sintaticamente válida, independentemente da conformidade com o padrão SQL ou das regras semânticas. Este era um mau hábito que foi corrigido introduzindo o sql_mode para instruir o MySQL a trabalhar de uma forma mais restritiva para validação de consulta.

Alguns usuários não estão cientes desse recurso porque o valor padrão não era tão restritivo. A partir de 5.7, o valor padrão é mais restritivo e esta é a razão pela qual alguns usuários têm problemas com falhas inesperadas de consulta após a migração para 5.7 ou 8.0.

variável sql_mode pode ser definida no arquivo de configuração ( /etc/my.cnf ) ou pode ser alterada em tempo de execução. O escopo da variável pode ser GLOBAL e SESSION, então ele pode mudar pelo propósito do modo para qualquer conexão única.

variável sql_mode pode ter mais valores, separados por vírgula, para controlar diferentes comportamentos. Por exemplo, você pode instruir o MySQL sobre como lidar com datas com zeros como '0000-00-00', para garantir que a data seja considerada válida ou não. No “modo indulgente” (ou se a variável sql_mode estiver vazia) você pode INSERIR tal valor sem problemas.

Mas este não é o comportamento correto conforme declarado pelo modo TRADICIONAL . Como os bons programadores sabem, você deve validar as datas em seu código-fonte para evitar dados incorretos ou resultados incorretos.

Veja a seguir como você pode instruir dinamicamente o MySQL a se comportar no modo tradicional para lançar um erro:

Existem muitos outros modos que você pode usar. Cobrir todos os modos não é o objetivo do artigo, portanto, consulte a documentação oficial para obter mais detalhes e exemplos:

https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html

https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html

 

O problema ONLY_FULL_GROUP_BY

Vamos nos concentrar na causa mais frequente de erros ao migrar para 5.7 ou 8.0. Como dissemos, 5.7 tem um modo SQL padrão que é mais restritivo do que 5.6 e, como tal, é para 8.0. Isso é verdade quando você atualiza o MySQL copiando o arquivo my.cnf antigo que não tem uma configuração específica para a variável sql_mode . Portanto, esteja atento.

Vamos criar uma tabela de exemplo para armazenar os cliques nas páginas do nosso site. Gostaríamos de registrar o nome da página e a id do usuário registrado.

 

Agora queremos fazer uma consulta para calcular as páginas mais visitadas.

A consulta funciona, mas não está realmente correta. É facilmente compreensível que page_url seja a coluna da função de agrupamento, o valor no qual estamos mais interessados ​​e queremos ser únicos para contagem. Além disso, a coluna de visitas é boa, pois é o contador. Mas e quanto ao user_id ? O que esta coluna representa? Nós agrupamos no page_url para que o valor retornado para user_id seja apenas um dos valores no grupo. Na verdade, não foi apenas o usuário número 1 que visitou o index.html, mas até mesmo os usuários 2 e 3 visitaram a página. Como posso considerar esse valor? É o primeiro visitante? É o último?

Não sabemos a resposta certa! Devemos considerar o valor da coluna user_id como um item aleatório do grupo.

De qualquer forma, a resposta certa é que a consulta não é semanticamente correta, pois não tem sentido retornar um valor de uma coluna que não faz parte da função de agrupamento. Então, espera-se que a consulta seja inválida no sql tradicional.

Vamos testar.

Agora temos um erro, como esperado.

O modo SQL ONLY_FULL_GROUP_BY faz parte do modo TRADICIONAL e está habilitado por padrão a partir de 5.7.

Muitos clientes tiveram esse tipo de problema após a migração para uma versão recente do MySQL.

Agora sabemos qual é a causa do problema, mas nossos aplicativos ainda não estão funcionando. Que soluções possíveis temos para permitir que os aplicativos voltem a funcionar?

Solução 1 - reescrever a consulta

Como não é correto selecionar uma coluna que não faz parte do agrupamento, podemos reescrever a consulta sem essas colunas. Muito simples.

Se você tiver muitas consultas afetadas pelo problema, terá que potencialmente fazer muito trabalho para recuperá-las e reescrevê-las. Ou talvez as consultas possam fazer parte de um aplicativo legado que você não consegue ou não quer tocar.

Mas essa solução é aquela que força você a escrever consultas corretas e permite que a configuração do seu banco de dados seja restritiva em termos de validação de SQL.

 

Solução 2 - volte ao modo indulgente

Você pode alterar a configuração do MySQL e voltar ao modo “indulgente”.

Ou você só pode eliminar o ONLY_FULL_GROUP_BY do padrão. O modo SQL padrão no MySQL 5.7 inclui estes modos: ONLY_FULL_GROUP_BY, STRINCT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER

 

Solução 3 - uso de funções de agregação

Se seu aplicativo absolutamente precisar recuperar o campo user_id por algum motivo válido, ou se for muito complicado alterar seu código-fonte, você pode contar com uma função de agregação para evitar a alteração da configuração do modo sql.

Por exemplo, podemos usar as funções de agregação MAX () , MIN () ou mesmo GROUP_CONCAT () .

 

O MySQL fornece até uma função específica para resolver o problema: ANY_VALUE ().

 

Fonte:

- https://www.percona.com/blog/2019/05/13/solve-query-failures-regarding-only_full_group_by-sql-mode/


2

Share

Donate to Site


About Author

Renato

Developer

Add a Comment

Blog Search


Categories

OUTROS (15) Variados (109) PHP (130) Laravel (158) Black Hat (3) front-end (28) linux (113) postgresql (39) Docker (27) rest (5) soap (1) webservice (6) October (1) CMS (2) node (7) backend (13) ubuntu (54) devops (25) nodejs (5) npm (2) nvm (1) git (8) firefox (1) react (6) reactnative (5) collections (1) javascript (6) reactjs (7) yarn (0) adb (1) Solid (2) blade (3) models (1) controllers (0) log (1) html (2) hardware (3) aws (14) Transcribe (2) transcription (1) google (4) ibm (1) nuance (1) PHP Swoole (5) mysql (31) macox (4) flutter (1) symfony (1) cor (1) colors (2) homeOffice (2) jobs (3) imagick (2) ec2 (1) sw (1) websocket (1) markdown (1) ckeditor (1) tecnologia (14) faceapp (1) eloquent (14) query (4) sql (40) ddd (3) nginx (9) apache (4) certbot (1) lets-encrypt (3) debian (11) liquid (1) magento (2) ruby (1) LETSENCRYPT (1) Fibonacci (1) wine (1) transaction (1) pendrive (1) boot (1) usb (1) prf (1) policia (2) federal (1) lucena (1) mongodb (4) paypal (1) payment (1) zend (1) vim (4) ciencia (6) js (1) nosql (1) java (1) JasperReports (1) phpjasper (1) covid19 (1) saude (1) athena (1) cinnamon (1) phpunit (2) binaural (1) mysqli (3) database (42) windows (6) vala (1) json (2) oracle (1) mariadb (4) dev (12) webdev (24) s3 (4) storage (1) kitematic (1) gnome (2) web (2) intel (3) piada (1) cron (2) dba (18) lumen (1) ffmpeg (2) android (2) aplicativo (1) fedora (2) shell (4) bash (3) script (3) lider (1) htm (1) csv (1) dropbox (1) db (3) combustivel (2) haru (1) presenter (1) gasolina (1) MeioAmbiente (1) Grunt (1) biologia (1) programming (22) performance (3) brain (1) smartphones (1) telefonia (1) privacidade (1) opensource (3) microg (1) iode (1) ssh (3) zsh (2) terminal (3) dracula (1) spaceship (1) mac (2) idiomas (1) laptop (2) developer (37) api (4) data (1) matematica (1) seguranca (2) 100DaysOfCode (9) hotfix (1) documentation (1) laravelphp (10) RabbitMQ (1) Elasticsearch (1) redis (2) Raspberry (4) Padrao de design (4) JQuery (1) angularjs (4) Dicas (40) Kubernetes (3) vscode (2) backup (1) angular (3) servers (2) pipelines (1) AppSec (1) DevSecOps (4) rust (1) RustLang (1) Mozilla (1) algoritimo (1) sqlite (1) Passport (1) jwt (4) security (2) translate (1) kube (2) iot (1) politica (2) bolsonaro (1) flow (1) podcast (1) Brasil (1) containers (3) traefik (1) networking (1) host (1) POO (2) microservices (2) bug (1) cqrs (1) arquitetura (2) Architecture (3) sail (3) militar (1) artigo (1) economia (1) forcas armadas (1) ffaa (1) autenticacao (1) autorizacao (2) authentication (4) authorization (2) NoCookies (1) wsl (4) memcached (1) macos (2) unix (2) kali-linux (1) linux-tools (5) apple (1) noticias (2) composer (1) rancher (1) k8s (1) escopos (1) orm (1) jenkins (4) github (5) gitlab (3) queue (1) Passwordless (1) sonarqube (1) phpswoole (1) laraveloctane (1) Swoole (1) Swoole (1) octane (1) Structurizr (1) Diagramas (1) c4 (1) c4-models (1) compactar (1) compression (1) messaging (1) restfull (1) eventdrive (1) services (1) http (1) Monolith (1) microservice (1) historia (1) educacao (1) cavalotroia (1) OOD (0) odd (1) chatgpt (1) openai (3) vicuna (1) llama (1) gpt (1) transformers (1) pytorch (1) tensorflow (1) akitando (1) ia (1) nvidia (1) agi (1) guard (1) multiple_authen (2) rpi (1) auth (1) auth (1) livros (2) ElonMusk (2) Oh My Zsh (1) Manjaro (1) BigLinux (2) ArchLinux (1) Migration (1) Error (1) Monitor (1) Filament (1) LaravelFilament (1) replication (1) phpfpm (1) cache (1) vpn (1) l2tp (1) zorin-os (1) optimization (1) scheduling (1) monitoring (2) linkedin (1) community (1) inteligencia-artificial (2) wsl2 (1) maps (1) API_KEY_GOOGLE_MAPS (1) repmgr (1) altadisponibilidade (1) banco (1) modelagemdedados (1) inteligenciadedados (4) governancadedados (1) bancodedados (2) Observability (1) picpay (1) ecommerce (1) Curisidades (1) Samurai (1) KubeCon (1) GitOps (1)

New Articles



Get Latest Updates by Email