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

Popular:
¡MEJORA LA CONFIGURACIÓN DE TU SERVIDOR! APLICAR AVA Y LANZA CON UN 15% DE DESCUENTO
USA EL CÓDIGO PROMOCIONAL:

¿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

  • La 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

(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ísticautf8utf8mb4
Máx bytes por carácter34
Cobertura UnicodeHasta 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 collationLimitadasMá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 1

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