Convertir base de datos a UTF8

Hace algún tiempo que tenía ganas de migrar una base de datos de ISO-8859-1 a UTF-8, pero cuando tienes un proyecto funcionando, hacer un cambio de este estilo es algo delicado y por lo tanto, uno intenta postergarlo. En cualquier caso, finalmente decidí liarme la manta a la cabeza y tirarlo adelante.

Por desgracia, no existe una sentencia SQL que haga algo similar de manera sencilla, sin embargo, podemos conseguirlo utilizando el comando de Linux recode (evolución bastante más inteligente del antiguo iconv), os dejo detallados los pasos que seguí para hacer el cambio:

1) Exportamos la base de datos mediante el comando mysqldump:

mysqldump -u  -p -f --single-transaction --opt -hlocalhost --all-databases | gzip -9 -c > [FICHERO_EXPORTACION_BD]

2) Recodificamos el archivo dump mediante el comando recode:

recode iso-8859-15..utf8 < [FICHERO_EXPORTACION_BD] > [FICHERO_EXPORTACION_BD].utf8

3) Editamos el archivo y reemplazamos “latin1” por “utf8”

4) Creamos la nueva base de datos con el encoding utf8:

mysql -u [USER] -p [DBNAME] -e "CREATE DATABASE `[DBNAME]` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;"

5) Por último, importamos la base de datos de la siguiente manera:

mysql -u [USER] -p [DBNAME] < [FICHERO_EXPORTACION_BD].utf8

NOTA!! En mi caso concreto, la aplicación PHP seguía mostrando errores al visualizar la información que provenía de base de datos a pesar de haber cambiado convenientemente los metas del html resultante. En mi caso era debido a que la conexión a la base de datos estaba forzada a leer en ISO. Esto lo solventé añadiendo justo después de la conexión:

@mysql_query("SET character_set_results='utf8'");

o si nuestra version de PHP es superior o igual a la 5.2.3, tambien podemos hacer:

@mysql_set_charset("utf8", $link_identifier);

2 thoughts on “Convertir base de datos a UTF8

  1. Estimado, desconozco en que lenguaje se encuentra tu proyecto pero una solución simple a tu problema, por ejemplo en php es utilizar la función php utf8_encode
    con la cual puedes solucionar los problemas de caracteres y acentos.
    ejemplo :

    en perl creo que puede usar utf8::encode
    y en python ..si no mal recuerdo es u = unicode( s, “utf-8″ )

    Hay varias maneras de solucionar el problema del UTF8 .
    Saludos!

  2. Amigo Max Sorribas, lo que propones es útil, pero es mucho más conveniente tener la db codificada en utf8 y evitarse la conversión con el php, así se evitaría procesos y se optimiza rendimiento.

Comments are closed.