Configuração de Codificação e Collation em Ambientes MySQL

Fundamentos de Codificação de Caracteres

No contexto de bancos de dados, o conceito de charset (conjunto de caracteres) abrange duas definições fundamentais. Primeiramente, refere-se ao agrupamanto de símbolos, incluindo alfabetos de diversos idiomas, numerais, pontuações e gráficos. Em segundo lugar, define a regra de mapeamento que converte esses caracteres em dados binários, conhecida como codificação.

Principais Padrões de Codificação

  • ASCII: Padrão americano para troca de informações. Utiliza 7 bits por caractere (1 byte), cobrindo 128 símbolos, focado em inglês e línguas西欧.
  • GBK: Extensão do padrão GB2312 para chinês simplificado. Utiliza codificação de byte duplo, suportando mais de 21.000 caracteres han, além de inglês e números.
  • UTF-8: Implementação de comprimento variável do padrão Unicode. É o padrão da indústria para compatibilidade global, utilizando de 1 a 4 bytes para representar qualquer caractere.
  • Outros: Incluem utf-32, utf-16, big5 (chinês tradicional) e latin1 (西欧).

Gerenciamento de Charsets no MySQL

Para inspectar os conjuntos de caracteres suportados pela instância, utilize o comando abaixo:

mysql> SHOW CHARACTER SET;
+----------+---------------------------------+---------------------+--------+
| Charset  | Description                     | Default collation   | Maxlen |
+----------+---------------------------------+---------------------+--------+
| latin1   | cp1252 West European            | latin1_swedish_ci   | 1      |
| utf8     | UTF-8 Unicode                   | utf8_general_ci     | 3      |
| utf8mb4  | UTF-8 Unicode                   | utf8mb4_general_ci  | 4      |
| gbk      | GBK Simplified Chinese          | gbk_chinese_ci      | 2      |
| ...      | ...                             | ...                 | ...    |
+----------+---------------------------------+---------------------+--------+

Nota: A inclusão de novos charsets geralmente ocorre durante a compilação do servidor MySQL, utilizando flags como --with-charset=gbk.

Relação entre Charset e Collation

Existe uma relação de um para muitos entre charset e collation (ordenação). Enquanto o charset define como armazenar, o collation define as regras de comparação e ordenação dos dados. Cada conjunto de caracteres possui múltiplas regras de collation associadas, impactando a precisão e performance das operações de string.

Para listar as regras disponíveis:

mysql> SHOW COLLATION;

A nomenclatura das collations no MySQL segue convenções específicas:

  • _ci: Case Insensitive (não sensível a maiúsculas/minúsculas).
  • _cs: Case Sensitive (sensível a maiúsculas/minúsculas).
  • _bin: Comparação baseada diretamente nos valores binários do código.

Hierarquia de Configuração

A definição de codificação no MySQL segue uma hierarquia de precedência, onde configurações mais específicas sobrescrevem as gerais:

Servidor > Banco de Dados > Tabela > Coluna

Nível de Servidor

Controlado por variáveis de sistema dinâmicas:

  • character_set_server: Define o charset padrão para operações internas.
  • character_set_system: Charset utilizado para metadados do sistema (nomes de tabelas, campos).

A configuração pode ser alterada via linha de comando ou arquivo de confgiuração (my.cnf).

Nível de Banco de Dados

Define o padrão para objetos criados dentro do schema. A variável character_set_database reflete o charset do banco atualmente selecionado.

CREATE DATABASE loja_online 
DEFAULT CHARACTER SET utf8mb4 
DEFAULT COLLATE utf8mb4_unicode_ci;

Se não especificado durante a criação, o banco herda a configuração do character_set_server.

Nível de Tabela e Coluna

A codificação dos dados armazenados segue a seguinte lógica de resolução:

  1. Verifica-se a definição explícita na coluna.
  2. Se inexistente, usa-se o DEFAULT CHARACTER SET da tabela.
  3. Se a tabela não definir, herda-se do banco de dados.
  4. Por fim, recorre-se à configuração do servidor.
CREATE TABLE pedidos (
    id INT PRIMARY KEY,
    descricao VARCHAR(255)
) DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_bin;

Inspeção e Alteração de Variáveis

Para visualizar o estado atual das configurações de codificação e ordenação:

mysql> SHOW VARIABLES LIKE '%CHARACTER%';
mysql> SHOW VARIABLES LIKE '%COLLATION%';

Exemplo de saída das variáveis de conexão:

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | latin1                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
+--------------------------+----------------------------+

Para alterar o charset padrão do servidor globalmente:

SET GLOBAL character_set_server = 'utf8mb4';

Para converter uma tabela existente para um novo padrão:

ALTER TABLE clientes CONVERT TO CHARACTER SET utf8mb4;

Conexão do Cliente e Codificação

O fluxo de dados entre o cliente e o servidor envolve três variáveis críticas:

  • character_set_client: Codificação dos dados enviados pelo cliente (SQL).
  • character_set_connection: Charset da camada de conexão (usada para conversão intermediária).
  • character_set_results: Codificação utilizada para retornar resultados ao cliente.

Recomenda-se unificar essas configurações utilizando:

SET NAMES 'utf8mb4';

Em arquivos de configuração, isso pode ser persistido via default-character-set = utf8mb4.

Diagnóstico de Problemas de Codificação

Caracteres corrompidos (mojibake) geralmente ocorrem devido a incompatibilidades entre a codificação de armazenamento e a declaração do cliente.

  • Cenário 1: O cliente envia dados em UTF-8, mas o armazenamento está em Latin1. Se o cliente informar corretamente via SET NAMES, o MySQL pode converter, mas o armazenamento pode perder dados não suportados.
  • Cenário 2: A tabela é UTF-8, o SET NAMES é UTF-8, mas o driver da aplicação envia bytes em GBK. Isso resulta em gravação incorreta.

Problemas com LOAD DATA INFILE frequentemente surgem quando o charset do arquivo difere do character_set_database. O servidor espera que o arquivo esteja na codificação do banco de dados destino, a menos que especificado otherwise.

Estratégia de Migração de Charset

Alterar a codificação de um banco de dados em produção requer cuidado para não corromper dados existentes. Comandos como ALTER DATABASE afetam apenas novos objetos. Para migrar dados legados, siga o processo de exportação e reimportação.

Exemplo: Migrar de latin1 para gbk.

  1. Exportar Estrutura: Dump do schema sem dados, especificando o charset de conexão desejado. ``` mysqldump -u root -p --default-character-set=gbk -d legado_v1 > schema_novo.sql
  2. Ajustar Schema: Edite manualmente o arquivo schema_novo.sql para garantir que as definições das tabelas usem o novo charset.
  3. Exportar Dados: Dump apenas dos dados, usando o charset original para garantir integridade dos bytes. ``` mysqldump -u root -p --quick --no-create-info --extended-insert --default-character-set=latin1 legado_v1 > dados_migrados.sql
  4. Ajustar Declaração de Dados: No arquivo dados_migrados.sql, altere a指令 SET NAMES latin1 para SET NAMES gbk.
  5. Criar Novo Banco: ``` CREATE DATABASE legado_v2 DEFAULT CHARSET gbk;
  6. Importar Estrutura: ``` mysql -u root -p legado_v2 < schema_novo.sql
  7. Importar Dados: ``` mysql -u root -p legado_v2 < dados_migrados.sql
    
    

Esta abordagem garante que os bytes dos dados sejam interpretados corretamente durante a transição entre conjuntos de caracteres.

Tags: MySQL charset collation utf8mb4 database-administration

Publicado em 9-28 06:41