Qual é a diferença entre utf8 e utf8mb4?
Ao trabalhar com bancos de dados MySQL, você pode encontrar as codificações de caracteres utf8 e utf8mb4, que podem parecer semelhantes à primeira vista. No entanto, elas têm diferenças significativas que podem afetar a forma como os dados são armazenados e exibidos, especialmente ao lidar com caracteres diversos e emojis. Compreender as diferenças entre utf8 e utf8mb4 é fundamental para escolher o conjunto de caracteres correto para seu banco de dados e garantir que seus dados sejam armazenados corretamente.
Neste artigo, exploraremos as diferenças entre utf8 e utf8mb4 no MySQL, por que o utf8mb4 foi introduzido e como migrar seu banco de dados para usar o utf8mb4, se necessário.
O que é utf8 no MySQL?
No MySQL, o conjunto de caracteres utf8 foi historicamente usado para armazenar dados Unicode. Ele foi planejado para suportar todos os caracteres Unicode, tornando-o adequado para a maioria dos dados de texto, incluindo muitos idiomas e caracteres especiais. No entanto, a implementação utf8 do MySQL suporta apenas um subconjunto do padrão UTF-8 completo.
Quantos bytes o utf8 usa?
O conjunto de caracteres utf8 do MySQL codifica caracteres usando de 1 a 3 bytes por caractere. Isso significa que ele não pode representar caracteres que exigem 4 bytes, como certos emojis e alguns caracteres chineses, japoneses e coreanos (CJK) menos usados. Se você tentar armazenar esses caracteres de 4 bytes em uma coluna utf8, o MySQL retornará um erro, causando falhas na inserção de dados.
Exemplo de caracteres não suportados com utf8:
- Emojis como ?, ? e ❤️.
- Alguns caracteres CJK raros.
- Símbolos matemáticos e outros símbolos Unicode especializados.
Essa limitação levou à introdução do utf8mb4 no MySQL.
O que é utf8mb4 no MySQL?
O conjunto de caracteres utf8mb4 no MySQL é uma verdadeira implementação do padrão UTF-8 completo. Ele suporta de 1 a 4 bytes por caractere, permitindo a gama completa de caracteres Unicode. Isso inclui todos os caracteres que o utf8 suporta, bem como os caracteres adicionais de 4 bytes que o utf8 não suporta.
Por que o utf8mb4 foi introduzido?
O MySQL introduziu o utf8mb4 para resolver as deficiências do utf8. Com o utf8mb4, você pode armazenar qualquer caractere Unicode válido, incluindo emojis, notas musicais, símbolos matemáticos e todo o conjunto de caracteres CJK. Isso torna o utf8mb4 o conjunto de caracteres preferido para aplicativos modernos que precisam oferecer suporte a uma ampla variedade de dados de texto.
Principais diferenças entre utf8 e utf8mb4
Recurso | utf8 | utf8mb4 |
Bytes por caractere | 1-3 | 1-4 |
Cobertura do Unicode | Parcial (exclui caracteres de 4 bytes) | Total (suporta todo o Unicode) |
Suporte a emojis | Não | Sim |
Caracteres CJK | A maioria, mas não todos | Todos |
Compatibilidade | Bancos de dados legados | Recomendado para novos projetos |
1. Comprimento do byte
A diferença mais significativa entre o utf8 e o utf8mb4 é o número de bytes que eles usam para armazenar caracteres. O utf8 suporta até 3 bytes, enquanto o utf8mb4 suporta até 4 bytes. Como resultado, o utf8mb4 pode armazenar uma gama mais ampla de caracteres Unicode.
2. Emoji e caracteres especiais
Se você precisar armazenar emojis ou qualquer caractere especial que exija 4 bytes, o utf8mb4 é a única opção viável. Com o utf8, a tentativa de armazenar um caractere de 4 bytes resultará em um erro, causando possível perda de dados ou falhas nos aplicativos.
3. Compatibilidade com banco de dados
o utf8 era o conjunto de caracteres padrão para muitas instalações antigas do MySQL, tornando-o compatível com sistemas legados. No entanto, para novos projetos e aplicativos que precisam dar suporte a um público global com diversos conjuntos de caracteres, o utf8mb4 é agora a escolha recomendada.
Por que usar utf8mb4 em vez de utf8?
Considerando as limitações do utf8, o uso do utf8mb4 é geralmente uma opção melhor para aplicativos modernos. Aqui estão alguns motivos para preferir o utf8mb4:
- Suporte total a Unicode: o utf8mb4 permite armazenar todos os caracteres Unicode, inclusive emojis, que estão se tornando cada vez mais comuns no conteúdo gerado pelo usuário.
- Preparado para o futuro: À medida que novos caracteres são adicionados ao padrão Unicode, o utf8mb4 garante que seu banco de dados possa lidar com eles.
- Compatibilidade global: Com o utf8mb4, você não precisa se preocupar com a compatibilidade do conjunto de caracteres para diferentes idiomas e símbolos especiais.
Quando você ainda deve usar o utf8?
Há alguns cenários em que o utf8 ainda pode ser considerado:
- Espaço de armazenamento: Como o utf8mb4 usa até 4 bytes por caractere, ele pode resultar em tamanhos de banco de dados um pouco maiores em comparação com o utf8. No entanto, essa diferença geralmente é insignificante para a maioria dos aplicativos.
- Sistemas legados: Se você tiver um aplicativo ou banco de dados existente que use utf8 e não precisar armazenar caracteres de 4 bytes, talvez não seja necessário mudar.
Como converter um banco de dados de utf8 para utf8mb4
Se você decidir migrar um banco de dados MySQL existente de utf8 para utf8mb4, isso envolve algumas etapas para garantir uma transição tranquila. Aqui está um guia geral para converter seu banco de dados para usar utf8mb4.
Etapa 1: Faça backup do seu banco de dados
Antes de fazer qualquer alteração, sempre faça backup do banco de dados para evitar a perda de dados:
mysqldump -u nome_do_usuário -p nome_do_banco_de_dados > database_backup.sql
Etapa 2: Alterar o conjunto de caracteres e a colação
Execute os seguintes comandos SQL para alterar o conjunto de caracteres e o agrupamento de seu banco de dados, tabelas e colunas para utf8mb4:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
Para cada tabela, execute:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Isso alterará o conjunto de caracteres e o agrupamento da tabela especificada e de suas colunas.
Etapa 3: Atualizar o arquivo de configuração
Para garantir que as novas tabelas e colunas usem utf8mb4 por padrão, atualize o arquivo de configuração do MySQL (my.cnf ou my.ini) com as seguintes configurações:
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
Reinicie o MySQL para aplicar as alterações:
sudo service mysql restart
Etapa 4: Verificar as alterações
Verifique se o conjunto de caracteres foi atualizado com êxito:
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
A saída deve exibir utf8mb4 como o conjunto de caracteres do seu banco de dados.