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:
- Verifica-se a definição explícita na coluna.
- Se inexistente, usa-se o
DEFAULT CHARACTER SETda tabela. - Se a tabela não definir, herda-se do banco de dados.
- 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.
- 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
- Ajustar Schema: Edite manualmente o arquivo
schema_novo.sqlpara garantir que as definições das tabelas usem o novo charset. - 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
- Ajustar Declaração de Dados: No arquivo
dados_migrados.sql, altere a指令SET NAMES latin1paraSET NAMES gbk. - Criar Novo Banco: ```
CREATE DATABASE legado_v2 DEFAULT CHARSET gbk;
- Importar Estrutura: ```
mysql -u root -p legado_v2 < schema_novo.sql
- 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.