Si al revisar tu sitio web o tu base de datos notas que las palabras con tildes, eñes o caracteres especiales se convirtieron en símbolos extraños (como ver ó en lugar de ó, o ñ en lugar de ñ), estás experimentando un problema clásico de codificación y cotejamiento (Collation).
¿Por qué ocurre esto?
Este fenómeno (conocido en el mundo técnico como Mojibake) ocurre cuando hay un divorcio entre la forma en que se envían los datos y la forma en que la base de datos los guarda. Generalmente pasa cuando tu sitio web envía la información en formato UTF-8 (el estándar moderno para internet), pero la tabla o la conexión de la base de datos está configurada en una codificación antigua como Latin1 o ISO-8859-1. Al no entenderse entre sí, el servidor "traduce" mal los caracteres y los corrompe.
¿Cómo solucionar los datos que ya están dañados?
Para reparar los textos que ya se guardaron de forma incorrecta, puedes ejecutar una consulta SQL que busque y reemplace masivamente estos patrones extraños por sus letras correspondientes.
IMPORTANTE ANTES DE COMENZAR: Ejecutar comandos de actualización masiva puede ser peligroso. Es obligatorio que realices un respaldo (backup) completo de tu base de datos antes de aplicar este procedimiento.
Debes abrir tu gestor de base de datos (como phpMyAdmin), ir a la pestaña SQL y ejecutar un comando basado en el siguiente modelo.
Nota: Este script es un ejemplo. Debes modificar tblticketnotes por el nombre real de tu tabla, y los campos admin y message por las columnas que contengan los textos dañados.
START TRANSACTION;
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, '\u00ad', ''), `[campo_2]` = REPLACE(`[campo_2]`, '\u00ad', '');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'ó', 'ó'), `[campo_2]` = REPLACE(`[campo_2]`, 'ó', 'ó');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'Ã', 'í'), `[campo_2]` = REPLACE(`[campo_2]`, 'Ã', 'í');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'ú', 'ú'), `[campo_2]` = REPLACE(`[campo_2]`, 'ú', 'ú');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'é', 'é'), `[campo_2]` = REPLACE(`[campo_2]`, 'é', 'é');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'á', 'á'), `[campo_2]` = REPLACE(`[campo_2]`, 'á', 'á');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'ñ', 'ñ'), `[campo_2]` = REPLACE(`[campo_2]`, 'ñ', 'ñ');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'Ã:', 'í'), `[campo_2]` = REPLACE(`[campo_2]`, 'Ã:', 'í');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'Ó', 'Ó'), `[campo_2]` = REPLACE(`[campo_2]`, 'Ó', 'Ó');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'Ã', 'Í'), `[campo_2]` = REPLACE(`[campo_2]`, 'Ã', 'Í');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'Ú', 'Ú'), `[campo_2]` = REPLACE(`[campo_2]`, 'Ú', 'Ú');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'É', 'É'), `[campo_2]` = REPLACE(`[campo_2]`, 'É', 'É');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'Ã', 'Á'), `[campo_2]` = REPLACE(`[campo_2]`, 'Ã', 'Á');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'Ñ', 'Ñ'), `[campo_2]` = REPLACE(`[campo_2]`, 'Ñ', 'Ñ');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, '°', '°'), `[campo_2]` = REPLACE(`[campo_2]`, '°', '°');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'ó', 'ó'), `[campo_2]` = REPLACE(`[campo_2]`, 'ó', 'ó');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'À', 'Á'), `[campo_2]` = REPLACE(`[campo_2]`, 'À', 'Á');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'ú', 'u'), `[campo_2]` = REPLACE(`[campo_2]`, 'ú', 'u');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'â€', '€'), `[campo_2]` = REPLACE(`[campo_2]`, 'â€', '€');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'â€', ''), `[campo_2]` = REPLACE(`[campo_2]`, 'â€', '');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'â€', '"'), `[campo_2]` = REPLACE(`[campo_2]`, 'â€', '"');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, '‘', '`'), `[campo_2]` = REPLACE(`[campo_2]`, '‘', '`');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, '€', '€'), `[campo_2]` = REPLACE(`[campo_2]`, '€', '€');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'â„', '"'), `[campo_2]` = REPLACE(`[campo_2]`, 'â„', '"');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'â…', '...'), `[campo_2]` = REPLACE(`[campo_2]`, 'â…', '...');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'â†', '→'), `[campo_2]` = REPLACE(`[campo_2]`, 'â†', '→');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'âˆ', '¨'), `[campo_2]` = REPLACE(`[campo_2]`, 'âˆ', '¨');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'â‰', '≠'), `[campo_2]` = REPLACE(`[campo_2]`, 'â‰', '≠');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'âŠ', 'Š'), `[campo_2]` = REPLACE(`[campo_2]`, 'âŠ', 'Š');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'â‹', '‹'), `[campo_2]` = REPLACE(`[campo_2]`, 'â‹', '‹');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'âœ', '†'), `[campo_2]` = REPLACE(`[campo_2]`, 'âœ', '†');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'â', '¥'), `[campo_2]` = REPLACE(`[campo_2]`, 'â', '¥');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'âº', 'º'), `[campo_2]` = REPLACE(`[campo_2]`, 'âº', 'º');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'â»', '»'), `[campo_2]` = REPLACE(`[campo_2]`, 'â»', '»');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'â¼', '¼'), `[campo_2]` = REPLACE(`[campo_2]`, 'â¼', '¼');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'â½', '½'), `[campo_2]` = REPLACE(`[campo_2]`, 'â½', '½');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'â¾', '¾'), `[campo_2]` = REPLACE(`[campo_2]`, 'â¾', '¾');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'â¿', '¿'), `[campo_2]` = REPLACE(`[campo_2]`, 'â¿', '¿');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'â', 'a'), `[campo_2]` = REPLACE(`[campo_2]`, 'â', 'a');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'â€', '-'), `[campo_2]` = REPLACE(`[campo_2]`, 'â€', '-');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'â’', "'"), `[campo_2]` = REPLACE(`[campo_2]`, 'â’', "'");
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'â“', '"'), `[campo_2]` = REPLACE(`[campo_2]`, 'â“', '"');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'â•', '•'), `[campo_2]` = REPLACE(`[campo_2]`, 'â•', '•');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'â–', '–'), `[campo_2]` = REPLACE(`[campo_2]`, 'â–', '–');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'â—', '—'), `[campo_2]` = REPLACE(`[campo_2]`, 'â—', '—');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'â˜', '˜'), `[campo_2]` = REPLACE(`[campo_2]`, 'â˜', '˜');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'â™', '™'), `[campo_2]` = REPLACE(`[campo_2]`, 'â™', '™');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'âš', 'š'), `[campo_2]` = REPLACE(`[campo_2]`, 'âš', 'š');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'âž', 'ž'), `[campo_2]` = REPLACE(`[campo_2]`, 'âž', 'ž');
UPDATE `[nombre_tabla]` SET `[campo_1]` = REPLACE(`[campo_1]`, 'Â', ''), `[campo_2]` = REPLACE(`[campo_2]`, 'Â', '');
COMMIT
¿Por qué el código usa TRANSACTION y COMMIT?
Hemos encapsulado las instrucciones entre START TRANSACTION y COMMIT por seguridad. Esto crea un bloque cerrado: si ocurre un error a mitad del proceso, la base de datos no aplicará ningún cambio incompleto, protegiendo la integridad de tu información.
¿Cómo evitar que vuelva a suceder?
Limpiar la base de datos soluciona el pasado, pero para proteger el futuro debes asegurarte de lo siguiente:
-
Cotejamiento correcto: Asegúrate de que tus tablas y bases de datos utilicen el cotejamiento
utf8mb4_general_cioutf8mb4_unicode_ci. -
Configuración de la app: Revisa el archivo de configuración de tu sitio web (por ejemplo, el
wp-config.phpen WordPress o tus archivos de conexión PDO/MySQLi) y verifica que el charset de conexión esté explícitamente definido comoutf8outf8mb4.