Después de investigar un rato, encontré que la configuración del servidor estaba un poco errática:
mysql> show variables LIKE '%character%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec)
Mi intención era guardar todos los datos usando UTF8, no latin1. En este caso, mi configuración estaba causando que las conexiones al servidor se crearan esperando un tipo de codificación, pero guardando los datos en otro. Podría pelearme con la configuración de MySQL, pero este servidor ya esta muy viejo y cada vez que cambio algo se rompen otras 10 cosas. Para solucionarlo rápidamente, mejor usamos PHP para cambiar la configuración de forma dinámica. Esto lo ponemos en el bootstrap de la aplicación:
$db_charset = $db->fetchRow("SHOW VARIABLES LIKE 'character_set_database'");
$db->query("SET NAMES '" . $db_charset->Value . "'");
$db->query("SET SESSION character_set_server = '$db_charset->Value'");
Sigue existiendo el problema con los datos que ya estaban guardados, pero de ahora en adelante los datos nuevos funcionarán sin problema.
No hay comentarios.:
Publicar un comentario