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 conjunto de caracteres "utf8"/"utf8mb3" no puede almacenar todos los puntos de código Unicode:solo admite el rango de 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 conjunto de caracteres denominado utf8[/utf8mb3] utiliza un máximo de tres bytes por carácter y contiene únicamente caracteres BMP. A partir de MySQL 5.5.3, el conjunto de caracteres utf8mb4 usa un máximo de cuatro bytes por carácter y admite caracteres complementarios:
-
Para un carácter BMP, utf8[/utf8mb3] y utf8mb4 tienen características de almacenamiento idénticas:mismos valores de código, misma codificación, misma longitud.
-
Para un carácter complementario, utf8[/utf8mb3] no puede almacenar el carácter en absoluto , mientras que utf8mb4 requiere cuatro bytes para almacenarlo. Dado que utf8[/utf8mb3] no puede almacenar ningún carácter, no tiene caracteres adicionales en las columnas utf8[/utf8mb3] y no debe preocuparse por convertir caracteres o perder datos al actualizar los datos de 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 lo desea), como emoji , utilice "utf8mb4". Consulte también ¿Cuáles son los caracteres Unicode no BMP más comunes en uso real? .