Se o texto acentuado aparece como ??? ou como é em vez de é, o problema é que a base, a ligação e a página não falam o mesmo conjunto de caracteres. A regra que resolve quase tudo é usar utf8mb4 nos três: na base, na ligação da aplicação e na página (<meta charset="utf-8">).
Os três sítios onde pode estar o erro
| Onde |
Como se vê |
Como se corrige |
| A página |
Os acentos saem partidos mesmo com a base certa. |
Declare utf-8 na página e grave o ficheiro em UTF-8. |
| A ligação |
Saem ??? ou é só quando o texto passa pela aplicação. |
Peça utf8mb4 ao ligar. Em PDO, charset=utf8mb4 no DSN. Em mysqli, set_charset('utf8mb4'). Veja o exemplo em PHP. |
| A base ou a tabela |
Dá erro ao gravar emojis, ou perde caracteres. |
Converta para utf8mb4 (abaixo). |
Converter uma base e as suas tabelas
| 2 |
No separador SQL do phpMyAdmin, para a base:ALTER DATABASE conta_base CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
|
| 3 |
Para cada tabela:ALTER TABLE nome_da_tabela CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
|
| 4 |
Na aplicação, peça utf8mb4 na ligação. No WordPress, DB_CHARSET no wp-config.php deve ser utf8mb4.
|
|
| 5 |
Teste gravando um texto com acento e um emoji, e releia-o.
|
|
|
Converter não recupera o que já se perdeu. Se a base guardou «???» no lugar das letras, essas letras desapareceram: convertê-las não as faz voltar. Só uma cópia antiga ou reescrever o texto resolve. E quando o texto saiu é (e não ???), há um problema de dupla codificação, que se resolve com cuidado: peça ajuda antes de mexer.
|
| Termo |
O que é |
utf8mb4 |
O conjunto de caracteres completo: acentos, alfabetos, emojis. O que deve usar. |
utf8 (ou utf8mb3) |
Uma versão mais curta, que não guarda emojis nem alguns caracteres. |
| Ordenação (collation) |
A regra de comparar e ordenar. utf8mb4_unicode_ci é uma escolha segura aqui. |
utf8mb4_0900_ai_ci |
Ordenação do MySQL 8. O MariaDB não a conhece. Veja MySQL ou MariaDB. |
Como saber o que a base tem
No separador SQL do phpMyAdmin, SHOW CREATE TABLE nome_da_tabela; mostra o conjunto de caracteres e a ordenação dessa tabela, e SHOW VARIABLES LIKE 'character_set%'; mostra os valores da ligação que está a usar. Se a tabela diz utf8mb4 e o texto sai mal, a falha está na ligação ou na página. Se a tabela diz latin1 e o texto tem emojis, está aí o problema. Identificar o sítio certo antes de converter evita mexer no que não estava avariado.
|
Os acentos continuam partidos depois de tudo isto? Diga-nos o endereço da página e o que a base mostra no phpMyAdmin e vemos consigo.
Abrir um pedido de suporte
|
PRODUTO RECOMENDADO Alojamento de sites com cPanel Domínio e SSL incluídos, cópias diárias e o painel que já conhece. desde 5.940,00 Kz/mês (plano de 3 anos, com cupão) Ver planos |