MySQL utf8 vs utf8mb4: 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, à primeira vista, podem parecer semelhantes. No entanto, elas têm diferenças significativas que podem afetar o armazenamento e a exibição de dados, especialmente ao lidar com caracteres e emojis diferentes. Compreender as diferenças entre utf8 e utf8mb4 é fundamental para escolher o conjunto de caracteres correto para o seu banco de dados e garantir que os dados sejam armazenados corretamente.
Neste artigo, veremos as diferenças entre utf8 e utf8mb4 no MySQL, os motivos para utf8mb4 e como migrar seu banco de dados para utf8mb4, se necessário.
O que é utf8 no MySQL?
No MySQL, o conjunto de caracteres utf8 tem sido historicamente usado para armazenar dados Unicode. Ele foi projetado 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 do utf8 do MySQL suporta apenas um subconjunto do padrão UTF-8 completo.
Quantos bytes o utf8 usa?
O conjunto de caracteres utf8 no MySQL codifica caracteres usando entre 1 e 3 bytes por caractere. Isso significa que ele não pode representar caracteres que exigem 4 bytes, como alguns emojis e alguns caracteres chineses, japoneses e coreanos (CJK) menos comuns. Se você tentar armazenar esses caracteres de 4 bytes em uma coluna utf8, o MySQL retornará um erro, causando falha na inserção de dados.
Exemplo de caracteres não suportados em utf8:
- Emoji como 😊, 🚀 e ❤️.
- Alguns caracteres CJK raros.
- Símbolos matemáticos e outros caracteres Unicode especializados.
Essa limitação levou à implementaçã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 que todo o conjunto de caracteres Unicode seja usado. Isso inclui todos os caracteres que o utf8 suporta, bem como 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, inclusive emoji, 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
Característica | 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 os caracteres |
Compatibilidade | Bancos de dados desatualizados | Recomendado para novos projetos |
1. Comprimento de bytes
A diferença mais significativa entre utf8 e utf8mb4 é o número de bytes usados para armazenar caracteres. o utf8 suporta até 3 bytes, enquanto o utf8mb4 suporta até 4 bytes. Como resultado, o utf8mb4 pode armazenar uma variedade maior de caracteres Unicode.
2. Emoji e caracteres especiais
Se você precisar armazenar emojis ou quaisquer caracteres especiais que exijam 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, que pode causar perda de dados ou falhas no aplicativo.
3. Compatibilidade com o 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 oferecer suporte a um público global com diferentes conjuntos de caracteres, o utf8mb4 agora é recomendado.
Por que usar utf8mb4 em vez de utf8?
Dadas 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.
- Prospectividade: à 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 caracteres especiais.
Quando ainda devo usar o utf8?
Há alguns cenários em que o utf8 ainda deve ser usado:
- Espaço de armazenamento de dados: Como o utf8mb4 usa até 4 bytes por caractere, isso pode resultar em um tamanho de banco de dados um pouco maior do que o utf8. Entretanto, para a maioria dos aplicativos, essa diferença costuma ser insignificante.
- 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 converter um banco de dados MySQL existente de utf8 para utf8mb4, isso envolve várias etapas para garantir uma transição tranquila. Aqui está um guia geral sobre como converter um banco de dados para utf8mb4.
Etapa 1: Faça backup do 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: Altere o conjunto de caracteres e o agrupamento
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 o comando:
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 fazer com 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: Verifique as alterações
Verifique se o conjunto de caracteres foi atualizado com êxito:
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
Como resultado, você deverá ver utf8mb4 como o conjunto de caracteres do seu banco de dados.