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:
character_set_client: codificação de origem da requisição enviada pelo cliente.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çãocollation_connection.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;