Problemas UTF-8 en MySQL: Causas y Soluciones Definitivas

problemas UTF-8 en MySQL

📅 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:

  1. La conexión cliente-servidor: qué charset declara tu aplicación (PHP, PDO, MySQLi) al hablar con MySQL.
  2. La base de datos y sus tablas: el charset y el collation definidos en el esquema.
  3. 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.
  4. 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';

Regla de oro del diagnóstico: si los datos ya se ven mal directamente desde phpMyAdmin o la consola, el problema está en el almacenamiento. Si en la base se ven bien pero en la web no, el fallo está en la conexión o en el HTML de salida.

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;

Tip: prueba siempre la conversión en un entorno de desarrollo o sobre una copia de la tabla antes de aplicarla en producción. Una conversión mal hecha puede destruir datos de forma irreversible. Lo he visto pasar.

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_set de 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 →

Te puede interesar:

ClisecSeguridad informática

Página GratisCrea tu web gratis

Scroll al inicio