1. Introducción
MySQL añadió esta codificación utf8mb4 después de la versión 5.5.3, lo que significa que la mayoría de los bytes son 4, y se usa específicamente para ser compatible con unicode de cuatro bytes. Por suerte, utf8mb4 es un superconjunto de utf8, y no se requiere otra conversión salvo cambiar la codificación a utf8mb4. Por supuesto, para ahorrar espacio, generalmente basta con usar utf8.
2. Descripción del contenido
Como se mencionó antes, dado que utf8 puede ahorrar la mayoría de caracteres chinos, ¿por qué usar utf8mb4? La longitud máxima de caracteres de la codificación UTF8 soportada por MySQL es de 3 bytes, y si encuentras un carácter ancho de 4 bytes, insertarás una excepción. El máximo de caracteres Unicode codificado por UTF-8 de tres bytes es 0xffff, que es el plano multilingüe básico (BMP) en Unicode. Es decir, cualquier carácter Unicode que no esté en el plano multitexto básico no puede almacenarse usando el conjunto de caracteres utf8 de Mysql. Estos incluyen emojis (Emoji es una codificación Unicode especial que se encuentra comúnmente en teléfonos iOS y Android), muchos caracteres chinos poco habituales, así como cualquier nuevo carácter Unicode, y más.
3. La causa raíz del problema
El formato original UTF-8 utilizaba de uno a seis bytes y podía codificar hasta 31 caracteres. La última especificación UTF-8 utiliza solo de uno a cuatro bytes y puede codificar hasta 21 bits, que es exactamente lo que representa los 17 planos Unicode. utf8 es un conjunto de caracteres en MySQL que solo soporta caracteres UTF-8 de hasta tres bytes de longitud, que es el plano multitexto básico en Unicode.
¿Por qué UTF8 en Mysql solo soporta caracteres UTF-8 con un máximo de tres bytes? Lo pensé, quizá porque cuando se desarrolló Mysql, Unicode no tenía plano auxiliar. En ese momento, el Comité Unicode aún soñaba con "65.535 caracteres son suficientes para todo el mundo". Las longitudes de cadenas en Mysql cuentan caracteres en lugar de bytes, y para tipos de datos CHAR, las cadenas deben ser lo suficientemente largas. Al usar el conjunto de caracteres utf8, la longitud que debe preservarse es la longitud de carácter más larga de utf8 multiplicada por la longitud de la cadena, por lo que es natural limitar la longitud máxima utf8 a 3, por ejemplo, Mysql CHAR(100) retendrá 300 bytes. En cuanto a por qué las versiones posteriores no soportan caracteres UTF-8 de 4 bytes, creo que una es por compatibilidad hacia atrás, y la otra es que rara vez se usan caracteres fuera del plano multilingüe básico.
Para guardar caracteres UTF-8 de 4 bytes en Mysql, se requiere el conjunto de caracteres utf8mb4, pero solo se soporta después de la versión 5.5.3 (ver versión: select version(); )。 Creo que para una mejor compatibilidad, siempre deberías usar utf8mb4 en lugar de utf8. Para datos tipo CHAR, utf8mb4 ocupa más espacio y, según la recomendación oficial de Mysql, usa VARCHAR en lugar de CHAR.
|