Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Entendendo conjuntos de caracteres e agrupamentos no MySQL

Se você já trabalhou com MySQL, inevitavelmente encontrou conjuntos de caracteres e agrupamentos. Nesta postagem do blog, tentaremos fornecer uma visão mais detalhada do que são esses dois e como você deve usá-los.

O que são conjuntos de caracteres e agrupamentos?

Simplificando, conjuntos de caracteres no MySQL são conjuntos de símbolos e codificações - collations são conjuntos de regras para comparar caracteres em um conjunto de caracteres. Em outras palavras, conjuntos de caracteres são conjuntos de caracteres válidos em uma string, enquanto agrupamentos são um conjunto de regras usadas para comparar caracteres em um conjunto de caracteres específico. Assim como cada conjunto de caracteres tem um agrupamento padrão, os conjuntos de caracteres também podem ter vários agrupamentos. MySQL tem um conjunto de caracteres padrão e agrupamento para o servidor e para cada banco de dados e tabela também.

Conjuntos de caracteres no MySQL

Em geral, os conjuntos de caracteres no MySQL funcionam assim:

  • Quando um banco de dados é criado, os conjuntos de caracteres são derivados da variável character_set_server de todo o servidor.
  • Quando uma tabela é criada, os conjuntos de caracteres são derivados do banco de dados.
  • Quando uma coluna é criada, os conjuntos de caracteres são derivados da tabela.

No que diz respeito aos conjuntos de caracteres, existem algumas variáveis ​​nas quais você deve ficar de olho:

  • Character_set_client define o conjunto de caracteres no qual as instruções são enviadas pelo cliente.
  • Character_set_connection define o conjunto de caracteres em que as instruções são traduzidas depois que um servidor recebe uma instrução do cliente.
  • Character_set_results define o conjunto de caracteres no qual o servidor retorna os resultados da consulta ao cliente.

Essas três configurações podem ser alteradas usando as instruções SET NAMES ou SET CHARACTER SET, ou mesmo nos arquivos de configuração do MySQL.

Ao lidar com conjuntos de caracteres, às vezes você também pode encontrar um erro #1267:

ERROR 1267 (HY000): Illegal mix of collations.

O erro acima geralmente é causado pela comparação de duas strings que possuem agrupamentos incompatíveis ou pela tentativa de selecionar dados que tenham um agrupamento diferente em uma coluna combinada. O erro é mostrado porque quando o MySQL compara dois valores com conjuntos de caracteres diferentes, ele deve convertê-los para o mesmo conjunto de caracteres para a comparação, mas os conjuntos de caracteres não são compatíveis. Para resolver esse problema, certifique-se de que os agrupamentos de cada tabela e suas colunas sejam os mesmos.

Agrupamentos no MySQL

Como já mencionado acima, os agrupamentos estão intimamente relacionados aos conjuntos de caracteres porque um agrupamento é um conjunto de regras que define como comparar e classificar cadeias de caracteres. Cada conjunto de caracteres tem pelo menos um agrupamento, alguns também têm mais.

Embora não entremos nos detalhes minuciosos de todas as coisas relacionadas ao agrupamento no MySQL nesta postagem do blog, há algumas coisas que você deve saber:

  • Se você estiver usando o MySQL 5.7, o agrupamento padrão do MySQL geralmente é latin1_swedish_ci porque o MySQL usa latin1 como seu conjunto de caracteres padrão. Se você estiver usando o MySQL 8.0, o conjunto de caracteres padrão é utf8mb4.
  • Se você optar por usar UTF-8 como seu agrupamento, sempre use utf8mb4 (especificamente utf8mb4_unicode_ci). Você não deve usar UTF-8 porque o UTF-8 do MySQL é diferente da codificação UTF-8 adequada. Este é o caso porque não oferece suporte completo a unicode, o que pode levar à perda de dados ou problemas de segurança. Tenha em mente que utf8mb4_general_ci é um conjunto simplificado de regras de classificação que usa atalhos projetados para melhorar a velocidade enquanto utf8mb4_unicode_ci classifica com precisão em uma ampla variedade de idiomas. Em geral, utf8mb4 é o conjunto de caracteres “mais seguro”, pois também suporta unicode de 4 bytes, enquanto utf8 suporta apenas até 3.

Escolhendo um bom conjunto de caracteres e agrupamento

Para escolher um bom agrupamento e conjunto de caracteres para seu conjunto de dados MySQL, lembre-se de mantê-lo simples. Uma mistura de diferentes conjuntos de caracteres e (ou) agrupamentos pode ser uma verdadeira bagunça, pois pode ser muito confuso (por exemplo, tudo pode funcionar bem até que determinados caracteres apareçam etc.), portanto, é melhor avaliar suas necessidades antecipadamente e escolher o melhor agrupamento e conjunto de caracteres antecipadamente. O MySQL também tem algumas consultas valiosas que podem ajudá-lo a fazer exatamente isso, por exemplo,

SELECT * FROM information_schema.CHARACTER_SETS ORDER BY CHARACTER_SET_NAME;

retornaria uma lista de conjuntos de caracteres e agrupamentos disponíveis junto com sua descrição, o que pode ser extremamente útil se você estiver planejando o design do seu banco de dados.

Lembre-se de que alguns conjuntos de caracteres podem exigir mais operações de CPU, além de consumir mais espaço de armazenamento. Usar conjuntos de caracteres errados pode até mesmo derrotar a indexação - por exemplo, o MySQL precisa converter conjuntos de caracteres para poder compará-los quando não são os mesmos:a conversão pode impossibilitar o uso de um índice.

Além disso, lembre-se de que algumas pessoas recomendam “usar apenas UTF-8 globalmente” - isso pode não ser necessariamente uma ótima ideia porque muitos aplicativos nem precisam de UTF-8 e, dependendo em seus dados, o UTF-8 pode causar mais problemas do que vale a pena (por exemplo, pode usar muito mais espaço de armazenamento no disco), então escolha sabiamente.

Resumo


Conjuntos de caracteres e agrupamentos podem ser seus amigos ou um de seus pesadelos - tudo depende de como você os usa. Em geral, tenha em mente que um “bom” conjunto de caracteres e agrupamento depende dos dados que seu banco de dados contém - o MySQL fornece algumas consultas para ajudá-lo a decidir o que usar, mas para que seus conjuntos de caracteres e agrupamentos sejam eficazes, você também deve pensar sobre quando faz sentido usar um certo agrupamento e por quê.