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 æ).
Use utf8mb4 como charset e utf8mb4_unicode_ci como collation. utf8mb4 suporta todos os caracteres Unicode, incluindo emojis.
Alterar o padrão para toda a base de dados (aplica‑se apenas a novas tabelas):
utf8mb4_unicode_ci no menu suspenso.Alterar uma tabela existente (incluindo todas as suas colunas):
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.
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.
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 clienteSET 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