Para entender más sobre el tema, nos vamos a situar en un problema real donde necesitamos instalar una aplicación. La aplicación que estamos instalando es Moodle, que es una herramienta de Gestión de Aprendizaje Online.
Cuando el programa procede a pedirnos los requerimientos de nuestra base de datos, se nos avisa de que es obligatorio un juego de caracteres utf8md4
. La razón es porqué Moodle usa símbolos Unicode para guardar emojis y estos exceden el espacio máximo por carácter establecido por la codificación Utf8.
Cada emoji
se compone de 4 bytes (\xF0\x9F\x98\x89) y estos exceden el tamaño máximo por carácter de 3 bytes de la codificación Utf8.
Para entenderlo un poco mejor retrocedamos en el tiempo y detallemos cada cambio sufrido en diferentes versiones MySQL.
- Allá por el año 2004, MySQL lanza su versión 4.1, que sería la primera en soportar juegos de caracteres (character sets) y collations. Estaban disponibles latin_1 y opcionalmente utf8. utf8 limitaba el espacio de cada carácter a un máximo de 3 bytes.
- En 2010, MySQL 5.5, incluyó soporte de hasta 4 bytes por carácter usando un nuevo conjunto de caracteres llamado ut8mb4.
- En 2015, con la llegada de MySQL 5.7 se cambió el formato de filas a InnoDB, para así permitir que campos varchar de hasta 255 caracteres aceptaran 4 bytes por carácter. Antes estos campos estaban limitados a 768bytes a causa de la limitación de 3 bytes por carácter de utf8.
- Con la llegada de MySQL 8 se está mejorando el rendimiento de utf8mb4 y será establecido como conjunto de caracteres predeterminado.
Teniendo estos factores en cuenta, es recomendable ir actualizando gradualmente las codificaciones utf8 de nuestras base de datos, ya que no pueden codificar la gran mayoría de caracteres Unicode, para así dejar paso a utf8mb4 tanto en bases de datos MySQL como MariaDB.
UTF8 + Unicode
Ya sabemos que utf8 es un formato de codificación de caracteres que ocupa entre 3 y 4 bytes por carácter. Normalmente cada carácter suele ocupar tan sólo 1 byte por lo que no tendremos problemas para guardarlos.
Estos juegos de caracteres UTF se guardan en un estándar Unicode
o ISO
. Unicode incluye mas 130.000 caracteres de lenguajes modernos y no tan modernos, además de colecciones de símbolos como pueden ser los emojis. Por lo que podemos decir que Unicode es un estándar que está evolucionando día tras día incorporando nuevos símbolos (incluidas nuestras vocales acentuadas y eñe).
Como cambiar la juegos de caracteres
Los juegos de caracteres los podemos cambiar con un programa de edición de base de datos (heidisql, etc …) o también tenemos la opción de hacerlo usando Queries SQL.
Para empezar cambiaremos el juego de caracteres de la Base de Datos
1 |
ALTER DATABASE tabla CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; |
Y a continuaremos lo haremos con cada tabla.
1 |
ALTER TABLE tabla CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; |
Automáticamente cada columna de la base de datos debe tomar su collation a utf8mb4_unicode_ci
Para optimizar tus consultas y recibir recomendaciones puedes usar la siguiente herramienta de optimización.
Ventajas y desventajas
Uno de los problemas a los que nos podemos enfrentar al usar utf8mb4 es que los datos ocuparán más espacio en nuestras tablas y también consumirán más recursos.
Por otro lado nuestros datos serán representados fielmente y las consultas mejoran su rendimiento con MySQL8.