¿Cuál es la diferencia entre utf8 y utf8mb4 en MySQL?
¿Cuál es la diferencia entre utf8 y utf8mb4 en MySQL?
La codificación de caracteres es fundamental para cómo se almacenan, consultan y renderizan los datos en las aplicaciones modernas y los entornos de hosting. Si estás ejecutando un sitio web o una aplicación web en un shared hosting, VPS, o un dedicated server impulsado por MySQL o MariaDB, probablemente te hayas encontrado con los términos utf8 y utf8mb4. A primera vista, parecen sinónimos—ambos representan codificaciones Unicode. Pero bajo el capó, hay una distinción crítica que puede hacer que tu app pueda o no almacenar datos de texto modernos como emojis, contenido multilingüe o ciertos caracteres CJK (chino, japonés, coreano)—especialmente en soluciones de hosting internacionalizadas o multilingual hosting solutions.

Definiciones
utf8
utf8La codificación Unicode heredada de MySQL.
Admite solo 3 bytes por carácter.
Capaz de almacenar caracteres en el Basic Multilingual Plane (BMP): U+0000 a U+FFFF.
No puede almacenar emojis, símbolos musicales, ciertos caracteres chinos y otros caracteres suplementarios.
utf8mb4
utf8mb4(Multi-Byte 4)
La implementación real de UTF-8.
Admite Unicode completo, incluidos caracteres fuera del BMP.
Usa hasta 4 bytes por carácter—tal como UTF-8 fue diseñado para hacerlo.
Necesario para almacenar emojis (😊), caracteres chinos raros (𠀋) o símbolos matemáticos (𝛑).
El engañoso utf8 en MySQL
En MySQL, el conjunto de caracteres utf8 no es una implementación completa del estándar UTF-8. Está limitado a 3 bytes, mientras que el UTF-8 estándar usa hasta 4 bytes. Esto significa:
utf8 en MySQL no es UTF-8 real.
Es más bien un subconjunto de UTF-8 que excluye los code points más allá de U+FFFF.
Por el contrario, utf8mb4 cumple plenamente con el estándar UTF-8.
Comparación técnica
| Característica | utf8 | utf8mb4 |
|---|---|---|
| Máx bytes por carácter | 3 | 4 |
| Cobertura Unicode | Hasta U+FFFF (solo BMP) | Rango completo (hasta U+10FFFF) |
| Compatibilidad con emojis | ❌ No | ✅ Sí |
| Compatibilidad con caracteres suplementarios | ❌ No | ✅ Sí |
| Compatibilidad con MySQL | ✅ Seguro para heredados | ✅ Unicode completo |
| Opciones de collation | Limitadas | Más extensas (p. ej., utf8mb4_0900_ai_ci) |
Por qué utf8mb4 es la opción correcta
1. Compatibilidad con emojis y símbolos modernos
No puedes almacenar 🐱, 🧠, 🚀 o 🇩🇪 usando utf8 de MySQL. Estos están fuera del BMP.
2. Mejor collation y ordenación
utf8mb4 admite collations más recientes como:
utf8mb4_unicode_ci: ordenación estándar Unicode
utf8mb4_general_ci: rápido pero menos preciso
utf8mb4_0900_ai_ci: collation moderna compatible con Unicode 9.0 (disponible en MySQL 8+)
3. Preparación para el futuro
A medida que Unicode se expande, los caracteres más nuevos quedarán fuera del rango de 3 bytes. utf8mb4 garantiza que no te quedes sin acceso a símbolos futuros.
¿Qué sucede si usas utf8?
Si intentas insertar un carácter de 4 bytes (como un emoji) en una columna con+, obtendrás este error:
ERROR 1366 (HY000): Incorrect string value: 'xF0x9Fx98x81' for column 'title' at row 1Peor aún, tu app podría truncar o corromper datos silenciosamente si no se valida correctamente.
Migración de utf8 a utf8mb4
Para migrar tu esquema de forma segura:
Paso 1: Actualiza las definiciones de tablas y columnas
ALTER TABLE my_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;Paso 2: Actualiza los valores predeterminados de la base de datos
ALTER DATABASE my_db CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;Paso 3: Actualiza la configuración de conexión de la aplicación
Asegúrate de que tu app se conecte usando utf8mb4:
SET NAMES utf8mb4;Mejores prácticas
✅ Usa siempre utf8mb4 para nuevas bases de datos.
✅ Usa utf8mb4_unicode_ci para precisión o utf8mb4_general_ci para rendimiento.
✅ Establece el charset predeterminado a nivel de tabla y base de datos.
✅ Asegúrate de que las bibliotecas de la capa de aplicación (p. ej., PDO, MySQLi, Sequelize) admitan utf8mb4.
Conclusión
La diferencia entre utf8 y utf8mb4 en MySQL es más que un byte: es la diferencia entre la compatibilidad moderna con Unicode y un fallo silencioso. Aunque utf8 sigue siendo compatible con versiones anteriores, está obsoleto para muchos casos de uso modernos. Siempre es preferible utf8mb4 para preparar tu aplicación para el futuro y garantizar compatibilidad completa con varios idiomas, emojis y símbolos especiales.


