
📅 Publicado el 3 de septiembre, 2026 · Por Equipo RedServicio
Acentos convertidos en é, signos de interrogación � donde debería ir una ñ, contenido que se guarda bien pero se muestra roto… Llevo años viendo estas incidencias y, la verdad, casi siempre se reduce a lo mismo: cuatro capas que no hablan el mismo idioma. En este artículo explico por qué ocurre y cómo dejarlo arreglado de una vez.
¿Por qué aparecen los problemas UTF-8 en MySQL?
La codificación se rompe cuando hay una discrepancia entre la codificación con la que entran los datos, la de la conexión, la del almacenamiento en la base y la con la que se pinta la web. Son cuatro capas. Y las cuatro tienen que coincidir:
- La conexión cliente-servidor: qué charset declara tu aplicación (PHP, PDO, MySQLi) al hablar con MySQL.
- La base de datos y sus tablas: el charset y el collation definidos en el esquema.
- Los archivos de tu aplicación: si tu archivo PHP está guardado en ANSI en vez de UTF-8, los textos literales ya llegan mal desde el principio.
- El HTML de salida: la etiqueta meta charset debe declarar UTF-8.
Basta con que uno solo de estos eslabones use latin1 mientras el resto va en UTF-8 para que empieces a ver caracteres corruptos.
Diagnóstico: identifica dónde se rompe la codificación
Antes de tocar nada, averigua en qué punto se pierde la información. Conéctate a MySQL y ejecuta:
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
Luego inspecciona el charset real de tus tablas:
SELECT TABLE_NAME, TABLE_COLLATION FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'tu_base';
Los síntomas más comunes
- é, ñ, ú: texto UTF-8 interpretado como latin1 (doble codificación).
- � (rombo con interrogación): caracteres perdidos; la conexión o la tabla rechazó los bytes UTF-8.
- Texto correcto en la BD pero corrupto en la web: falta declarar UTF-8 en la conexión o en el header HTML.
Configurar MySQL correctamente para UTF-8
Desde MySQL 5.5.3 existe utf8mb4, que soporta el verdadero UTF-8 de 4 bytes (emojis incluidos). El antiguo utf8 de MySQL solo admite 3 bytes, un detalle que ha causado más de un quebradero de cabeza. La recomendación actual es clara: usa siempre utf8mb4 con el collation utf8mb4_unicode_ci.
Editar el archivo de configuración my.cnf / my.ini
Añade o modifica estas líneas y reinicia MySQL:
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
[client]
default-character-set = utf8mb4
Convertir una base de datos existente a UTF-8
¿Ya tienes datos almacenados? Entonces lo primero es una copia de seguridad completa. Sin excepciones.
mysqldump -u usuario -p --default-character-set=utf8mb4 tu_base > backup.sql
Después, convierte la base de datos:
ALTER DATABASE tu_base CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Y cada tabla:
ALTER TABLE mi_tabla CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Cuidado con la doble codificación
Aquí está la trampa. Si tus datos ya están corruptos (UTF-8 guardado en columnas latin1), la conversión directa lo empeorará todo. La técnica segura pasa por convertir primero a binario y de ahí a UTF-8:
ALTER TABLE mi_tabla MODIFY columna VARCHAR(255) CHARACTER SET binary;
ALTER TABLE mi_tabla MODIFY columna VARCHAR(255) CHARACTER SET utf8mb4;
Configurar la conexión desde tu aplicación
Con MySQLi (PHP)
$mysqli = new mysqli("localhost", "usuario", "pass", "base");
$mysqli->set_charset("utf8mb4");
Con PDO (PHP)
$pdo = new PDO('mysql:host=localhost;dbname=base;charset=utf8mb4', 'usuario', 'pass');
En el HTML
Comprueba que tu página declara la codificación en el <head>:
<meta charset="utf-8">
Y revisa también que tus archivos fuente estén guardados como «UTF-8 sin BOM» en tu editor de código. Es un detalle que se olvida con frecuencia.
Prevención: cómo no volver a pasar por esto
- Usa utf8mb4 como estándar en todos los proyectos nuevos.
- Declara el charset explícitamente en cada conexión; no confíes en los valores por defecto del servidor.
- Exporta e importa dumps con
--default-character-set=utf8mb4. - Al migrar entre servidores, compara siempre las variables
character_setde ambos. - Documenta el charset del proyecto para que todo el equipo siga el mismo criterio.
Preguntas frecuentes
¿Es lo mismo utf8 y utf8mb4 en MySQL?
No. El utf8 de MySQL es un subconjunto de 3 bytes que no soporta emojis ni caracteres Unicode menos comunes. Usa siempre utf8mb4.
¿Puedo cambiar el charset sin perder datos?
Sí, siempre que hagas backup previo y evites la doble codificación usando la conversión vía binary cuando los datos ya estén corruptos.
Conclusión
Al final, todo se reduce a la coherencia en la cadena: base de datos en utf8mb4, conexiones configuradas explícitamente, archivos fuente en UTF-8 y un HTML que declare la codificación. Con un buen diagnóstico y las conversiones correctas, los caracteres extraños desaparecen para siempre. Y si prefieres no pelear con estos detalles, en RedServicio.net ofrecemos hosting con MySQL preconfigurado en utf8mb4 y soporte técnico 24/7 para ayudarte con cualquier incidencia de codificación o migración de tu base de datos.
Equipo RedServicio
Artículos escritos y revisados por nuestro equipo técnico especializado en hosting e infraestructura web en España.
¿Listo para un hosting de verdad?
Servidores en España · Soporte 24/7 en español · Migración gratuita
Ver Planes desde 3,95€/mes →