MySQL utf8 vs utf8mb4: ¿cuál es la diferencia entre utf8 y utf8mb4?
Cuando trabaje con bases de datos MySQL, puede encontrarse con las codificaciones de caracteres utf8 y utf8mb4, que a primera vista pueden parecer similares. Sin embargo, tienen diferencias significativas que pueden afectar al almacenamiento y la visualización de datos, especialmente cuando se trata de distintos caracteres y emojis. Comprender las diferencias entre utf8 y utf8mb4 es fundamental para elegir el conjunto de caracteres adecuado para su base de datos y asegurarse de que sus datos se almacenan correctamente.
En este artículo, veremos las diferencias entre utf8 y utf8mb4 en MySQL, las razones para utf8mb4, y cómo migrar su base de datos a utf8mb4 si es necesario.
¿Qué es utf8 en MySQL?
En MySQL, el conjunto de caracteres utf8 se ha utilizado históricamente para almacenar datos Unicode. Fue diseñado para soportar todos los caracteres Unicode, por lo que es adecuado para la mayoría de los datos de texto, incluyendo muchos idiomas y caracteres especiales. Sin embargo, la implementación de MySQL de utf8 sólo soporta un subconjunto del estándar UTF-8 completo.
¿Cuántos bytes utiliza utf8?
El conjunto de caracteres utf8 en MySQL codifica caracteres usando entre 1 y 3 bytes por carácter. Esto significa que no puede representar caracteres que requieran 4 bytes, como algunos emojis y algunos caracteres chinos, japoneses y coreanos (CJK) menos comunes. Si intenta almacenar tales caracteres de 4 bytes en una columna utf8, MySQL devolverá un error, haciendo que falle la inserción de datos.
Ejemplo de caracteres no soportados en utf8:
- Emoji como 😊, 🚀 y ❤️.
- Algunos caracteres CJK poco comunes.
- Símbolos matemáticos y otros caracteres Unicode especializados.
Esta limitación llevó a la implementación de utf8mb4 en MySQL.
¿Qué es utf8mb4 en MySQL?
El conjunto de caracteres utf8mb4 en MySQL es una verdadera implementación del estándar UTF-8 completo. Soporta de 1 a 4 bytes por carácter, permitiendo utilizar todo el conjunto de caracteres Unicode. Esto incluye todos los caracteres que utf8 soporta, así como caracteres adicionales de 4 bytes que utf8 no soporta.
¿Por qué se introdujo utf8mb4?
MySQL introdujo utf8mb4 para solucionar las deficiencias de utf8. Con utf8mb4, puede almacenar cualquier carácter Unicode válido, incluyendo emoji, notas musicales, símbolos matemáticos y todo el conjunto de caracteres CJK. Esto convierte a utf8mb4 en el conjunto de caracteres preferido para las aplicaciones modernas que necesitan soportar una amplia gama de datos de texto.
Principales diferencias entre utf8 y utf8mb4
Caracteres | utf8 | utf8mb4 |
Bytes por carácter | 1-3 | 1-4 |
Cobertura Unicode | Parcial (excluye caracteres de 4 bytes) | Completa (admite todo Unicode) |
Compatibilidad con emoji | No | Sí |
Caracteres CJK | La mayoría, pero no todos | Todos |
Compatibilidad | Bases de datos obsoletas | Recomendado para nuevos proyectos |
1. Longitud en bytes
La diferencia más significativa entre utf8 y utf8mb4 es el número de bytes utilizados para almacenar caracteres. utf8 admite hasta 3 bytes, mientras que utf8mb4 admite hasta 4 bytes. Como resultado, utf8mb4 puede almacenar una gama más amplia de caracteres Unicode.
2. Emoji y caracteres especiales
Si necesita almacenar emoji o cualquier carácter especial que requiera 4 bytes, utf8mb4 es la única opción viable. Con utf8, al intentar almacenar un carácter de 4 bytes se producirá un error, que puede causar la pérdida de datos o el bloqueo de la aplicación.
3. Compatibilidad con bases de datos
utf8 era el conjunto de caracteres por defecto para muchas instalaciones antiguas de MySQL, haciéndolo compatible con sistemas heredados. Sin embargo, para nuevos proyectos y aplicaciones que necesitan soportar una audiencia global con diferentes juegos de caracteres, utf8mb4 es ahora recomendado.
¿Por qué utilizar utf8mb4 en lugar de utf8?
Dadas las limitaciones de utf8, utilizar utf8mb4 es generalmente una mejor opción para las aplicaciones modernas. He aquí algunas razones para preferir utf8mb4:
- Compatibilidad total con Unicode: utf8mb4 permite almacenar todos los caracteres Unicode, incluidos los emojis, cada vez más comunes en los contenidos generados por los usuarios.
- Prospectividad: A medida que se añaden nuevos caracteres al estándar Unicode, utf8mb4 garantiza que su base de datos pueda manejarlos.
- Compatibilidad global: Con utf8mb4, no tiene que preocuparse por la compatibilidad del conjunto de caracteres para diferentes idiomas y caracteres especiales.
¿Cuándo debería seguir utilizando utf8?
Hay algunos casos en los que utf8 debe seguir utilizándose:
- Espacio de almacenamiento de datos: Dado que utf8mb4 utiliza hasta 4 bytes por carácter, el tamaño de la base de datos puede ser ligeramente superior al de utf8. Sin embargo, para la mayoría de las aplicaciones esta diferencia suele ser insignificante.
- Sistemas heredados: Si dispone de una aplicación o base de datos que utiliza utf8 y no necesita almacenar caracteres de 4 bytes, el cambio puede no ser necesario.
Cómo convertir una base de datos de utf8 a utf8mb4
Si decide convertir una base de datos MySQL existente de utf8 a utf8mb4, implica varios pasos para garantizar una transición sin problemas. He aquí una guía general sobre cómo convertir una base de datos a utf8mb4.
Paso 1: Copia de seguridad de la base de datos
Antes de realizar cualquier cambio, haga siempre una copia de seguridad de su base de datos para evitar la pérdida de datos:
mysqldump -u nombre_usuario -p nombre_base_de_datos > copia_de_seguridad.sql
Paso 2: Cambiar el juego de caracteres y la intercalación
Ejecute los siguientes comandos SQL para cambiar el juego de caracteres y la intercalación de su base de datos, tablas y columnas a utf8mb4:
ALTER DATABASE nombre_base_de_datos CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
Para cada tabla, ejecute el comando
ALTER TABLE nombre_tabla CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Esto cambiará el conjunto de caracteres y la intercalación para la tabla especificada y sus columnas.
Paso 3: Actualizar el archivo de configuración
Para que las nuevas tablas y columnas utilicen utf8mb4 por defecto, actualice el archivo de configuración de MySQL (my.cnf o my.ini) con los siguientes ajustes:
[cliente]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
colación-servidor = utf8mb4_unicode_ci
Reinicie MySQL para aplicar los cambios:
sudo service mysql restart
Paso 4: Compruebe los cambios
Compruebe que el juego de caracteres se ha actualizado correctamente:
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
Como resultado, debería ver utf8mb4 como el conjunto de caracteres de su base de datos.