Simply.com is available in english

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):

  1. Inicie sessão no phpMyAdmin e selecione a base de dados no lado esquerdo.
  2. Clique no separador Operações.
  3. Encontre a secção Collation (Ordenação).
  4. Selecione utf8mb4_unicode_ci no menu suspenso.
  5. Clique em Executar.

Alterar uma tabela existente (incluindo todas as suas colunas):

  1. Selecione a tabela no lado esquerdo.
  2. Clique no separador Operações.
  3. Em Opções da tabela selecione a nova collation.
  4. Marque a opção Alterar também a collation para todas as colunas.
  5. 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 cliente
  • character_set_connection — o que o servidor usa internamente durante o processamento da query
  • character_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

Outros artigos relevantes