Quando falamos de sites WordPress, lojas virtuais ou qualquer sistema moderno, garantir que os textos apareçam corretamente – inclusive com emojis, acentos, símbolos e caracteres especiais – é fundamental. Muitos problemas estranhos de banco de dados, que afetam até grandes empresas, têm a ver com uma pegadinha histórica do MySQL: a diferença entre os conjuntos de caracteres utf8 e utf8mb4.
O utf8 do MySQL foi criado para permitir o armazenamento de texto em vários idiomas no mesmo banco de dados, usando o padrão UTF-8, que é amplamente utilizado na web.
No entanto, no MySQL, o utf8 NÃO IMPLEMENTA O PADRÃO COMPLETO! Ele suporta no máximo 3 bytes por caractere, enquanto o verdadeiro UTF-8 pode usar até 4 bytes. Isso significa que vários símbolos, emojis e caracteres asiáticos mais raros simplesmente não podem ser gravados se a tabela estiver em utf8.
Para corrigir essa limitação, a partir do MySQL 5.5.3 foi introduzido o utf8mb4 (multi-byte 4), que implementa o padrão UTF-8 completo: permite armazenar qualquer caractere Unicode, incluindo emojis, símbolos matemáticos, caracteres históricos e de idiomas complexos.
Na época em que o MySQL criou o suporte a utf8
, acreditava-se que 3 bytes por caractere seriam suficientes para quase todos os usos. Porém, a internet evoluiu: começaram a surgir emojis, caracteres raros, ícones, e com isso a necessidade de suportar o padrão completo.
Sites e sistemas que dependem do utf8
tradicional começaram a apresentar problemas quando usuários tentavam inserir emojis, símbolos especiais ou certos caracteres de línguas asiáticas.
Incorrect string value
ou simplesmente remover o caractere.Você pode descobrir facilmente usando o phpMyAdmin, Adminer ou com um comando SQL. No terminal, conecte ao banco e digite:
SHOW CREATE TABLE sua_tabela;
Procure por algo como DEFAULT CHARSET=utf8
ou DEFAULT CHARSET=utf8mb4
.
Você também pode ver os padrões globais do banco:
SHOW VARIABLES LIKE 'character_set%';
Se você já tem um banco em utf8, é possível converter para utf8mb4 sem perder dados, mas é preciso cuidado e backup antes de tudo. Veja um exemplo de comando para converter todas as tabelas de um banco:
ALTER TABLE sua_tabela CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Se quiser converter todas as tabelas de uma vez (em um script):
mysql -u usuario -p -e "SELECT CONCAT('ALTER TABLE ', table_name, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;') FROM information_schema.tables WHERE table_schema = 'SEU_BANCO'" > script.sql
mysql -u usuario -p SEU_BANCO < script.sql
Após isso, lembre-se de ajustar também a configuração do banco (no my.cnf
ou my.ini
):
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
E, claro, configure sua aplicação para conectar usando utf8mb4!
A partir do MySQL 8.0, utf8mb4 já é o padrão para novos bancos de dados criados, e cada vez mais frameworks e CMS (como o WordPress) recomendam ou exigem o uso desse conjunto de caracteres.
Muitos provedores de hospedagem já criam bases em utf8mb4 por padrão, mas se seu projeto é antigo, vale a pena conferir. No futuro, o uso do utf8 tradicional será totalmente desaconselhado, pois pode causar limitações sérias de compatibilidade.
A diferença entre utf8 e utf8mb4 no MySQL pode parecer um detalhe técnico, mas faz toda a diferença para garantir que seu site ou sistema suporte tudo que os usuários esperam – dos acentos às carinhas, dos símbolos matemáticos a idiomas de todo o mundo. Não espere aparecer erro para se preocupar: adote utf8mb4 o quanto antes!
Se precisar de ajuda para converter seu banco de dados ou tem dúvidas sobre charset e collation, a equipe da Saldaris Consultoria está à disposição. Basta preencher o formulário abaixo!