Gestão de Conjuntos de Caracteres e Regras de Ordenação no MySQL

Fundamentos de Codificação e Ordenação

O MySQL mapeia dados textuais através de conjuntos de caracteres (charset) e define seu tratamento comparativo mediante regras de ordenação (collation). As principais families incluem latin1 (padrão histórico para línguas europeias ocidentais), utf8mb4 (versão completa do UTF-8 com suporte a 4 bytes, incluindo emojis e hieróglifos) e utf8 (legado com limite de 3 bytes). Em contextos de mercado asiático, convenções como gbk ou big5 permanecem relevantes para eficiência de armazenamento. Cada conjunto exige pelo menos uma collation associada, identificada por sufixos que indicam o comportamento de classificação:

  • _ci: Case-Insensitive (ignora diferença entre maiúsculas e minúsculas)
  • _cs: Case-Sensitive (diferencia caixa)
  • _bin: Binário (comparação byte a byte)

Inspecionando Recursos Disponíveis

Para elencar as codificações suportadas pela instância, consulte o dicionário interno do servidor:

SHOW CHARACTER SET;

O retorno exibe a família, descrição humana, colação padrão e o consumo máximo de bytes por caractere. Já para filtrar as regras de ordenação vinculadas a uma família específica, utilize:

SHOW COLLATION LIKE 'latin1%';

Fluxo de Comunicação Cliente-Servidor

A integridade textual durante sessões ativas depende de três variáveis de contexto que orquestram conversões implícitas:

  1. character_set_client: codificação de origem da requisição enviada pelo cliente.
  2. character_set_connection: camada intermediária onde o servidor reencoda a instrução para sua representação interna e aplica a lógica de classificação collation_connection.
  3. character_set_results: codificação aplicada aos dados retornados ao cliente após processamento.

Observe que comparações diretas envolvendo colunas previamente definidas com charset próprio bypassam a variável de conexão, respeitando estritamente a regra declarada na estrutura.

Configuração Dinâmica e Persistente

Mudanças em tempo de execução podem ser aplicadas via escopo de sessão. O comando SET NAMES ajusta simultaneamente as três variáveis acima:

SET NAMES utf8mb4;
SELECT @@character_set_client, @@character_set_connection, @@character_set_results;

Uma sintaxe alternativa equivalente é SET CHARACTER SET <nome>. Para tornar a configuração permanente sem alterar arquivos de sistema, adicione a flag na linha de comando do serviço ou configure o parâmetro default-character-set dentro das seções [client] ou [mysql] do arquivo my.cnf / my.ini.

Hierarquia de Aplicação

O MySQL resolve conflitos de codificação seguindo uma ordem de precedência estrita: Servidor → Banco de Dados → Tabela → Coluna. Quanto mais baixo na hierarquia, maior a prioridade de resolução.

Nível Global (Servidor)

Define o padrão arquitetural da instância. Aplica-se no bloco [mysqld] do arquivo de configuração:

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

Nível de Esquema (Banco de Dados)

Tabelas criadas subsequentemente herdam essa configuração quando nenhuma cláusula override é fornecida:

CREATE SCHEMA app_produtiva DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;
ALTER SCHEMA app_produtiva CHARACTER SET utf8mb4;
SHOW CREATE DATABASE app_produtiva;

Nível de Estrutura (Tabela)

Específico para objetos físicos. Se omitido, segue a herança do esquema pai:

CREATE TABLE transacoes (
    referencia BIGINT PRIMARY KEY AUTO_INCREMENT,
    observacoes TEXT
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin;

-- Tabela herdará automaticamente a definição do banco ativo
CREATE TABLE auditoria (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    log_mensagem VARCHAR(500)
);

Nível Detalhado (Coluna)

Permite granularidade extrema, porém conversões automáticas podem gerar truncamento silencioso ou perda de diacríticos. Declaração inline ou modificação post-factum via DDL:

CREATE TABLE documentos_multilenguagem (
    conteudo_oc VARCHAR(255) CHARACTER SET latin1,
    conteudo_cn VARCHAR(255) CHARACTER SET gb2312,
    conteudo_glb VARCHAR(255) CHARACTER SET utf8mb4
) DEFAULT CHARSET=utf8mb4;

-- Reclassificação em estrutura já populada
ALTER TABLE documentos_multilenguagem MODIFY conteudo_cn VARCHAR(255) CHARACTER SET utf8mb4;

Tags: MySQL character-sets collations utf8mb4 gbk

Publicado em 9-5 23:28