Desarrollo y bases de datos
MySQL 8, cambio de codificación de caracteres de latin1 a utf8mb4
Los valores predeterminados del fabricante pasaron de latin1 en MySQL 5.7 a utf8mb4 en MySQL 8. La configuración de un servidor puede ser distinta. Actualizar MySQL no convierte automáticamente todas las tablas existentes; también importa el juego de caracteres que negocia la aplicación al conectarse.
Este cambio no supone mayor problema dado que las aplicaciones definen el charset a usar en la capa de conexión a MySQL, pero podría ocurrir en aplicaciones muy antiguas o desarrollos propios que esto no suceda, y, por lo tanto, tras el cambio se detecte que los datos aparecen en pantalla con caracteres "extraños".
Antes de cambiar nada, comprueba la codificación real de las tablas y la configuración que espera la aplicación. Forzar latin1 solo es correcto cuando el proyecto y sus datos siguen usando ese juego de caracteres; no sirve para reparar datos ya convertidos o almacenados con una codificación incorrecta.
Comprobar dónde aparece el problema
Revisa una muestra conocida de texto en la base y en la web, sin volver a guardarla todavía. Si phpMyAdmin la muestra correctamente y tu aplicación no, comprueba la conexión y la codificación de la respuesta HTML. Si ya está mal almacenada, cambiar la conexión no la reparará. Trabaja sobre una copia antes de intentar convertir datos.
Desde la misma conexión que usa la aplicación, puedes consultar:
SELECT @@character_set_client, @@character_set_connection,
@@character_set_results, @@collation_connection;
Ejecutarlo desde phpMyAdmin muestra la sesión de phpMyAdmin, no la de tu aplicación. Revisa además el juego de caracteres de las columnas afectadas; puede diferir del predeterminado de la tabla.
Mantener temporalmente una aplicación latin1
Configura el juego de caracteres desde el propio conector. Con MySQLi:
mysqli_set_charset($connection, 'latin1');
Con PDO, inclúyelo en el DSN al crear la conexión:
$dsn = 'mysql:host=localhost;dbname=BASE_DE_DATOS;charset=latin1'; $connection = new PDO($dsn, $user, $password);
No uses mysql_select_db() ni mysql_query(): pertenecen a la antigua extensión mysql, eliminada de PHP desde la versión 7. Tampoco es recomendable enviar SET NAMES manualmente con MySQLi, porque mysqli_set_charset() mantiene sincronizado el juego de caracteres que usa el cliente al escapar cadenas.
Preparar la actualización
Si el proyecto admite Unicode completo, planifica la conversión a utf8mb4 con un clon, una copia recuperable y pruebas de lectura y escritura. No cambies a latin1 una aplicación que ya utiliza correctamente utf8mb4.
También te puede ayudar
- Convertir base de datos utf8 a utf8mb4 Migra tablas de utf8 a utf8mb4 en una base clonada, revisando collations e índices y conservando un...
- Cerrar consultas MySQL en ejecución Identifica consultas MySQL lentas o bloqueadas y distingue entre detener una sentencia y cerrar su c...
- Clonar base de datos Duplica una base MySQL creando antes el destino y sus permisos en cPanel, y copiando después estruct...
- Conexión remota y segura al servidor MySQL Protege una conexión MySQL remota mediante un túnel SSH y configura por separado las credenciales SS...
¿Algo no cuadra o ha cambiado? Cuéntanoslo y lo revisamos.