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? .