1. Introdução
O MySQL adicionou essa codificação utf8mb4 após a 5.5.3, o que significa que a maioria dos bytes é 4, e é especificamente usado para ser compatível com unicode de quatro bytes. Felizmente, utf8mb4 é um superconjunto do utf8, e nenhuma outra conversão é necessária além de mudar a codificação para utf8mb4. Claro, para economizar espaço, geralmente basta usar utf8.
2. Descrição do conteúdo
Como mencionado acima, já que o utf8 pode salvar a maioria dos caracteres chineses, por que usar o utf8mb4? O comprimento máximo de caracteres da codificação UTF8 suportada pelo MySQL é de 3 bytes, e se você encontrar um caractere largo de 4 bytes, inserirá uma exceção. O caractere Unicode máximo codificado por UTF-8 de três bytes é 0xffff, que é o plano multilíngue básico (BMP) no Unicode. Ou seja, qualquer caractere Unicode que não esteja no plano multitexto básico não pode ser armazenado usando o conjunto de caracteres utf8 do Mysql. Incluem emojis (Emoji é uma codificação Unicode especial comumente encontrada em telefones iOS e Android), muitos caracteres chineses incomumente usados, além de novos caracteres Unicode, entre outros.
3. A causa raiz do problema
O formato original UTF-8 usava de um a seis bytes e podia codificar até 31 caracteres. A especificação mais recente do UTF-8 usa apenas de um a quatro bytes e pode codificar até 21 bits, que é exatamente o que representa todos os 17 planos Unicode. UTF8 é um conjunto de caracteres no MySQL que suporta apenas caracteres UTF-8 com até três bytes de comprimento, que é o plano básico multitexto no Unicode.
Por que o UTF8 no Mysql só suporta caracteres UTF-8 com no máximo três bytes? Pensei nisso, talvez porque, quando o Mysql foi desenvolvido, o Unicode não tinha um plano auxiliar. Naquela época, o Comitê Unicode ainda sonhava com "65.535 caracteres são suficientes para o mundo inteiro". Os comprimentos das strings no Mysql contam caracteres em vez de bytes, e para tipos de dados CHAR, as strings precisam ser longas o suficiente. Ao usar o conjunto de caracteres utf8, o comprimento que precisa ser preservado é o comprimento maior de caracteres utf8 multiplicado pelo comprimento da string, então é natural limitar o comprimento máximo utf8 a 3, por exemplo, o Mysql CHAR(100) reterá 300 bytes. Quanto ao motivo de versões subsequentes não suportarem caracteres UTF-8 de 4 bytes, acho que uma é por questões de compatibilidade retroativa, e a outra é que caracteres fora do plano multilíngue básico raramente são usados.
Para salvar caracteres UTF-8 de 4 bytes no Mysql, é necessário o conjunto de caracteres utf8mb4, mas só é suportado após a versão 5.5.3 (veja versão: select version(); )。 Acho que, para melhor compatibilidade, você sempre deve usar utf8mb4 em vez de utf8. Para dados do tipo CHAR, utf8mb4 consome mais espaço e, de acordo com a recomendação oficial do Mysql, use VARCHAR em vez de CHAR.
|