Qual é a diferença entre charsets utf8mb4 e utf8 no MySQL?

341

Qual é a diferença entre utf8mb4e utf8charsets no MySQL ?

Eu já sei sobre codificações ASCII , UTF-8 , UTF-16 e UTF-32 ; mas estou curioso para saber qual é a diferença do utf8mb4grupo de codificações com outros tipos de codificação definidos no MySQL Server .

Existem benefícios / propostas especiais de uso em utf8mb4vez de utf8?

Mojtaba Rezaeian
fonte

Respostas:

391

UTF-8 é uma codificação de comprimento variável. No caso de UTF-8, isso significa que o armazenamento de um ponto de código requer de um a quatro bytes. No entanto, a codificação do MySQL chamada "utf8" (alias de "utf8mb3") armazena apenas um máximo de três bytes por ponto de código.

Portanto, o conjunto de caracteres "utf8" / "utf8mb3" não pode armazenar todos os pontos de código Unicode: ele suporta apenas o intervalo de 0x000 a 0xFFFF, que é chamado de " Plano multilíngue básico ". Consulte também Comparação de codificações Unicode .

Isto é o que (uma versão anterior da mesma página em) a documentação do MySQL tem a dizer sobre isso:

O conjunto de caracteres nomeado utf8 [/ utf8mb3] usa no máximo três bytes por caractere e contém apenas caracteres BMP. No MySQL 5.5.3, o conjunto de caracteres utf8mb4 usa no máximo quatro bytes por caractere que suporta caracteres suplementares:

  • Para um caractere BMP, utf8 [/ utf8mb3] e utf8mb4 têm características de armazenamento idênticas: mesmos valores de código, mesma codificação, mesmo comprimento.

  • Para um caractere suplementar, utf8 [/ utf8mb3] não pode armazenar o caractere , enquanto utf8mb4 requer quatro bytes para armazená-lo. Como utf8 [/ utf8mb3] não pode armazenar o caractere, você não possui caracteres suplementares nas colunas utf8 [/ utf8mb3] e não precisa se preocupar com a conversão de caracteres ou com a perda de dados ao atualizar dados utf8 [/ utf8mb3] de versões mais antigas MySQL.

Portanto, se você deseja que sua coluna suporte o armazenamento de caracteres fora do BMP (e geralmente o deseja), como emoji , use "utf8mb4". Consulte também Quais são os caracteres Unicode não BMP mais comuns em uso real? .

CodeCaster
fonte
10
Os únicos casos que encontrei (até agora) em que utf8mb4 era 'necessário' são chineses e emoticons. Existem alfabetos obscuros que precisam dele.
Rick James
10
Também é necessário se você usar para manter senhas e dados criptografados em seu banco de dados. Eu estava mantendo a senha criptografada no mysql usando o formato utf8 normal, o que me causou muitos problemas com algumas senhas aleatoriamente e muito difíceis de depurar, então finalmente tentei usar a codificação base64 e resolvi o problema temporariamente. Mas agora eu sei o motivo.
Mojtaba Rezaeian
37
Os dados criptografados @idealidea são binários e você não deve armazenar dados binários em uma coluna varchar. :)
CodeCaster 20/01
8
@thomasrutter Experimente este caractere (𡞰) para salvar com UTF-8. :)
502_Geek 27/03
2
@MojtabaRezaeian depende um pouco do algoritmo de senha - o bcrypt2 produzirá ASCII.
Jasen
60

O utf8mb4conjunto de caracteres é útil porque hoje em dia precisamos de suporte para armazenar não apenas caracteres do idioma, mas também símbolos, emojis recém-introduzidos e assim por diante.

Uma boa leitura sobre Como suportar Unicode completo nos bancos de dados MySQL de Mathias Bynens também pode esclarecer isso.

Jimmy Kane
fonte
11
O MySQL 8.0 agora é o padrão para o conjunto de caracteres utf8mb4. [ mysql.com/products/enterprise/techspec.html]
Ahmed Rezk
47

Retirado do Manual de Referência do MySQL 8.0 :

  • utf8mb4: Uma codificação UTF-8 do conjunto de caracteres Unicode usando um a quatro bytes por caractere.

  • utf8mb3: Uma codificação UTF-8 do conjunto de caracteres Unicode usando um a três bytes por caractere.

No MySQL, utf8 atualmente, existe um alias utf8mb3que está obsoleto e será removido em uma versão futura do MySQL . Nesse ponto, utf8 será uma referência a utf8mb4 .

Portanto, independentemente desse alias, você pode definir conscientemente uma utf8mb4codificação.

Para completar a resposta, gostaria de adicionar o comentário do @ WilliamEntriken abaixo (também retirado do manual):

Para evitar ambiguidade sobre o significado de utf8, considere especificar utf8mb4explicitamente para referências ao conjunto de caracteres em vez de utf8.

simhumileco
fonte