Conjuntos de caracteres: utf8mb4, ordenação e os pontos de interrogação no texto

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

1 Faça uma cópia primeiro. Veja exportar com o phpMyAdmin.
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.

Para um site WordPress, confirme também onde está a ligação. Veja reconstruir a ligação do wp-config.php.

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

VEJA TAMBÉM

Importar uma base de dados com o phpMyAdmin

MySQL ou MariaDB: qual corre aqui

A que horas está o servidor, e porque o PHP e o MySQL podem discordar

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
  • 0 Utilizadores acharam útil
Esta resposta foi útil?