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?
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.
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.
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, utf8será uma referência autf8mb4 .
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.
O
utf8mb4
conjunto 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.
fonte
Retirado do Manual de Referência do MySQL 8.0 :
No MySQL,
utf8
atualmente, existe um aliasutf8mb3
que está obsoleto e será removido em uma versão futura do MySQL . Nesse ponto,utf8
será uma referência autf8mb4
.Portanto, independentemente desse alias, você pode definir conscientemente uma
utf8mb4
codificação.Para completar a resposta, gostaria de adicionar o comentário do @ WilliamEntriken abaixo (também retirado do manual):
fonte