¿Cuál es la diferencia entre utf8mb4 y utf8 charsets en MySQL?

341

¿Cuál es la diferencia entre utf8mb4y utf8charsets en MySQL ?

Ya sé acerca de las codificaciones ASCII , UTF-8 , UTF-16 y UTF-32 ; pero tengo curiosidad por saber cuál es la diferencia del utf8mb4grupo de codificaciones con otros tipos de codificación definidos en MySQL Server .

¿Existen beneficios / propuestas especiales de uso en utf8mb4lugar de utf8?

Mojtaba Rezaeian
fuente

Respuestas:

391

UTF-8 es una codificación de longitud variable. En el caso de UTF-8, esto significa que almacenar un punto de código requiere de uno a cuatro bytes. Sin embargo, la codificación de MySQL llamada "utf8" (alias de "utf8mb3") solo almacena un máximo de tres bytes por punto de código.

Por lo tanto, el juego de caracteres "utf8" / "utf8mb3" no puede almacenar todos los puntos de código Unicode: solo admite el rango 0x000 a 0xFFFF, que se denomina " Plano multilingüe básico ". Consulte también Comparación de codificaciones Unicode .

Esto es lo que (una versión anterior de la misma página en) la documentación de MySQL tiene que decir al respecto:

El juego de caracteres llamado utf8 [/ utf8mb3] usa un máximo de tres bytes por carácter y contiene solo caracteres BMP. A partir de MySQL 5.5.3, el conjunto de caracteres utf8mb4 utiliza un máximo de cuatro bytes por carácter que admite caracteres adicionales:

  • Para un carácter BMP, utf8 [/ utf8mb3] y utf8mb4 tienen características de almacenamiento idénticas: los mismos valores de código, la misma codificación, la misma longitud.

  • Para un carácter suplementario, utf8 [/ utf8mb3] no puede almacenar el carácter en absoluto , mientras que utf8mb4 requiere cuatro bytes para almacenarlo. Como utf8 [/ utf8mb3] no puede almacenar el carácter en absoluto, no tiene ningún carácter suplementario en las columnas utf8 [/ utf8mb3] y no necesita preocuparse por convertir caracteres o perder datos al actualizar datos utf8 [/ utf8mb3] de versiones anteriores de MySQL

Entonces, si desea que su columna admita el almacenamiento de caracteres que se encuentran fuera del BMP (y generalmente desea), como emoji , use "utf8mb4". Consulte también ¿Cuáles son los caracteres Unicode no BMP más comunes en uso real? .

CodeCaster
fuente
10
Los únicos casos que he encontrado (hasta ahora) donde utf8mb4 fue 'requerido' son chinos y emoticones. Hay alfabetos oscuros que lo necesitan.
Rick James
10
También es necesario si utiliza para mantener contraseñas y datos cifrados en su base de datos. Mantuve la contraseña cifrada en mysql usando el formato utf8 normal, lo que me causó muchos problemas con algunas contraseñas al azar y muy difícil de depurar, así que finalmente intenté usar la codificación base64 y solucioné el problema temporalmente. Pero, ahora sé la razón.
Mojtaba Rezaeian
38
Los datos cifrados de @idealidea son binarios, y no debe almacenar datos binarios en una columna varchar. :)
CodeCaster
8
@thomasrutter Pruebe este (𡞰) personaje para guardar con UTF-8. :)
502_Geek
2
@MojtabaRezaeian depende un poco del algoritmo de contraseña: bcrypt2 producirá ASCII.
Jasen
47

Tomado del Manual de referencia de MySQL 8.0 :

  • utf8mb4: Una codificación UTF-8 del juego de caracteres Unicode usando de uno a cuatro bytes por carácter.

  • utf8mb3: Una codificación UTF-8 del juego de caracteres Unicode que utiliza de uno a tres bytes por carácter.

En MySQL utf8 actualmente hay un alias para el utf8mb3cual está en desuso y se eliminará en una futura versión de MySQL . En ese punto utf8 se convertirá en una referencia para utf8mb4 .

Entonces, independientemente de este alias, puede establecer conscientemente una utf8mb4codificación.

Para completar la respuesta, me gustaría agregar el comentario de @ WilliamEntriken a continuación (también tomado del manual):

Para evitar la ambigüedad sobre el significado de utf8, considere especificar utf8mb4explícitamente referencias de juegos de caracteres en lugar de utf8.

simhumileco
fuente