Conjunto de caracteres e colação numa base de dados MySQL
Use charset utf8mb4 e collation utf8mb4_unicode_ci no MySQL e altere‑os via phpMyAdmin ou comandos ALTER, lembre‑se também de definir SET NAMES para a ligação.
Charset (conjunto de caracteres) determina quais caracteres a base de dados pode armazenar, e a collation determina como os caracteres são comparados e ordenados. Um charset incorreto é a causa mais frequente de que letras dinamarquesas (æ, ø, å) ou emojis sejam exibidos como pontos de interrogação ou mojibake (por exemplo æ em vez de æ).
Valores recomendados
Use utf8mb4 como charset e utf8mb4_unicode_ci como collation. utf8mb4 suporta todos os caracteres Unicode, incluindo emojis.
Método 1: phpMyAdmin
Alterar o padrão para toda a base de dados (aplica‑se apenas a novas tabelas):
- Inicie sessão no phpMyAdmin e selecione a base de dados no lado esquerdo.
- Clique no separador Operações.
- Encontre a secção Collation (Ordenação).
- Selecione
utf8mb4_unicode_cino menu suspenso. - Clique em Executar.
Alterar uma tabela existente (incluindo todas as suas colunas):
- Selecione a tabela no lado esquerdo.
- Clique no separador Operações.
- Em Opções da tabela selecione a nova collation.
- Marque a opção Alterar também a collation para todas as colunas.
- Clique em Executar.
Método 2: SQL
Alterar o padrão da base de dados:
ALTER DATABASE mindatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Alterar uma tabela e todas as suas colunas:
ALTER TABLE mintabel CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
No phpMyAdmin pode alterar o charset por coluna: selecione a tabela, clique em Estrutura, clique em Alterar ao lado da coluna e selecione a nova collation na definição da coluna.
Converter todas as tabelas de uma só vez
Gerar os comandos ALTER automaticamente:
SELECT CONCAT('ALTER TABLE `', TABLE_NAME, '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;')
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'mindatabase' AND TABLE_TYPE = 'BASE TABLE';
Execute o resultado no phpMyAdmin no separador SQL ou via linha de comando.
Charset da conexão (SET NAMES)
O charset da base de dados e o charset da conexão são duas coisas diferentes. Mesmo que as suas tabelas estejam correctamente configuradas para utf8mb4, os caracteres podem ficar corrompidos em trânsito se a conexão entre a aplicação e o MySQL usar outro charset.
SET NAMES utf8mb4 define três variáveis de sessão ao mesmo tempo:
character_set_client— o que o servidor espera receber do clientecharacter_set_connection— o que o servidor usa internamente durante o processamento da querycharacter_set_results— o que o servidor devolve ao cliente
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
Melhor prática: use a opção de charset integrada do driver em vez de enviar SET NAMES manualmente. Isto garante que funções como mysqli_real_escape_string() e PDO::quote() também utilizem o charset correcto — caso contrário, em raras circunstâncias pode abrir vulnerabilidades de injeção SQL.
Artigo da categoria de suporte: MySQL