Informações divergentes entre o resultado da query SQL via linha de comando e via client

1. Informações divergentes entre o resultado da query SQL via linha de comando e via client

Fernando Müller Junior
fernandomullerjr

(usa Outra)

Enviado em 23/09/2021 - 11:18h



Bom dia, estou com alguns problemas envolvendo as consultas via MYSQL.

As informações estõa divergentes entre o resultado da query SQL via linha de comando e via client.

Ajustei as configurações do MYSQL no arquivo cnf, consultando via linha de comando ele traz o resultado esperado neste caso:

mysql> SHOW VARIABLES LIKE '%char%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.01 sec)

mysql>

mysql> show variables like 'collation%'; +----------------------+-----------------+ | Variable_name | Value | +----------------------+-----------------+ | collation_connection | utf8_unicode_ci | | collation_database | utf8_unicode_ci | | collation_server | utf8_unicode_ci | +----------------------+-----------------+ 3 rows in set (0.00 sec)

mysql>

Porém via MYSQL WORKBEN ou via DBeaver ele traz informações diferentes do esperado:

SHOW VARIABLES LIKE '%char%' character_set_client utf8mb4 character_set_connection utf8mb4 character_set_database utf8 character_set_filesystem binary character_set_resultscharacter_set_server utf8 character_set_system utf8 character_sets_dir /usr/share/mysql/charsets/

show variables like 'collation%' collation_connection utf8mb4_general_ci collation_database utf8_unicode_ci collation_server utf8_unicode_ci

O que pode estar ocasionando esta divergência?



  


2. Re: Informações divergentes entre o resultado da query SQL via linha de comando e via client

Buckminster
Buckminster

(usa Debian)

Enviado em 23/09/2021 - 17:36h

O Mysql é o banco de dados.
O MySQL Workbench é uma ferramenta visual para banco de dados.
O DBeaver também é uma ferramenta visual para banco de dados.

Mas vamos analisar as saídas:
character_set_client | utf8

e

character_set_client | utf8mb4

"Note
The utf8mb3 character set is deprecated and you should expect it to be removed in a future MySQL release. Please use utf8mb4 instead. Although utf8 is currently an alias for utf8mb3, at some point utf8 is expected to become a reference to utf8mb4. To avoid ambiguity about the meaning of utf8, consider specifying utf8mb4 explicitly for character set references instead of utf8."

"Observação
O conjunto de caracteres (charset) utf8mb3 está obsoleto e você deve esperar que ele seja removido em uma versão futura do MySQL. Use utf8mb4 em vez de utf8mb3 . Embora utf8 seja atualmente um alias para utf8mb3, em algum momento o alias utf8 deverá se tornar uma referência para utf8mb4. Para evitar ambigüidade sobre o significado de utf8, considere especificar utf8mb4 explicitamente para referências de conjunto de caracteres (charset) em vez de utf8."

https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8.html

O Mysql ainda não implementou o padrão UTF8 completamente, ele implementou apenas símbolos de até 3 bytes e esqueceu o resto. Ainda assim, o utf8 e o utf8mb4 tem uma grande compatibilidade, a maioria absoluta dos caracteres vão ser iguais nos dois sistemas (no Mysql e na linguagem da aplicação).
Para consertar este erro do utf8mb3, a partir da versão 5.5, o MySQL implementou o padrão completo indo de 1 até 4 bytes e como já havia usado o nome utf8 chamou sua nova implementação de utf8mb4. Resumindo: o utf8 do MySQL não é UTF-8 padrão e o utf8mb4 segue totalmente o padrão UTF-8, mas não é igual... que confusão fizeram né?
Nas suas aplicações (em PHP, Java, etc) que usarem Mysql sempre defina no código fonte o UTF8 para evitar problemas de acentos, caracteres estranhos, etc. Sempre faça com que o Mysql "pegue" o charset da linguagem.

No Mysql:
default-character-set = utf8mb4

Na linguagem:
utf8

Lembre-se: nunca é demais definir o charset na linguagem.

Essas diferenças que deram nas saídas é porque o Workbench e o Dbeaver "lêem" o charset como utf8mb4 do Mysql e o Mysql "lê" e apresenta o próprio charset utf8mb3 ou utf8mb4 com o alias utf8 (lembrando que mesmo o utf8mb4 do Mysql não é o mesmo que o padrão UTF-8, apesar de que são compatíveis)... e a confusão continua.
O utf8 ali na tua saída do Mysql, vá saber se é utf8mb3 ou utf8mb4, provavelmente é utfbmb4 por causa da saída do Workbench e do Dbeaver.
Acredito que para ter a mesma saída tu deverá definir o mesmo charset para todos, Mysql, Workbench e DBeaver e sugiro colocar como utf8mb4 para evitar a confusão do alias (apelido) utf8 do Mysql.
Qual é a versão do teu Mysql?

Para complementar, aqui tem uma boa explicação sobre esse tal Collation do Mysql e sua diferença do charset e sobre o collation em geral (o Mysql sempre fazendo mysquelices):
https://www.geeksforgeeks.org/what-is-collation-and-character-set-in-mysql/

https://www.dirceuresende.com/blog/sql-server-como-padronizar-o-collation-de-todas-as-colunas-do-dat...


________________________________________________
Always listen the Buck!
Sanou tua dúvida, resolveu teu problema?
Então marque como Resolvido e escolha a Melhor Resposta.







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts