Convertir BD en MySQL de LATIN1 a UTF8


A todos los administradores o desarrolladores Web nos ha pasado alguna vez que nos equivocamos o tenemos que hacer un porting a causa de la dichosa codificación de caracteres.

El problema viene porque normalemente en MySQL la codificación de caracteres por defecto es la dependiente de la configuración local de la máquina donde está instalado (en mi caso LATIN1), sin embargo lo más común es que la codificación correcta en la mayoría de los casos es UTF8.

En este post se explicará el proceso detalladamente:

  1. Hacer un backup de la base de datos con la codificación mala (LATIN1) a un fichero de texto:

    mysqldump -u <usuario_BD> -p <nombre_BD_latin1> --default-character-set=latin1 > <nombre_BD_latin1>.sql

    Donde: usuario_BD es el nombre de usuario de la base de datos, nombre_BD_latin1 es el nombre de la base de datos con la codificación mala; este comando te pedirá la clave del usuario de base de datos introducido.

  2. Crear una base de datos vacía con condificación de caracteres UTF8:

    mysql -u <usuario_BD> -p
    CREATE DATABASE <nombre_BD_utf8> CHARACTER SET utf8 COLLATE utf8_general_ci;
    quit
  3. Modificar los caracteres del backup de LATIN1 a UTF8:

    iconv -f ISO-8859-1 -t UTF-8 <nombre_BD_latin1>.sql > <nombre_BD_utf8>.sql
  4. Substituir en la creación de las tablas del fichero de backup las cadenas que hacen que las tablas se creen con la codificación mala:

    perl -pi -w -e 's/CHARSET=latin1/CHARSET=utf8/g;' <nombre_BD_utf8>.sql
  5. Importar el fichero de backup en la nueva base de datos:

    mysql -u <usuario_BD> -p <nombre_BD_utf8> --default-character-set=utf8 < <nombre_BD_utf8>.sql

Enlaces a información de interés sobre el tema:

, , , , , ,

  1. #1 by Juan Yves on 2009/10/01 - 14:46

    A mi no me funciona absolutamente nada.

    Llevo unos meses intentando hacer la conversión de varias bases de datos, creo que he probado todo lo que anda por la web.

    Encima cuando entro datos en una nueva base de datos con todas las variables a charset utf8 en todas sus posibilidades, en una tabla utf8, por medio de phpmyadmin o sqlyog los carácteres aparecen correctamente en phpmyadmin, sin embargo en el navegador (con o sin el meta content=”text/html;utf8″) me salen los caráteres “chinos”).

    Si hago un SELECT HEX(‘€’) en phpmyadmin me da correctamente E282AC.

    Por medio del navegador, si entro los datos a través de php, (sin utf_encode o decode, y sin ninguna conversión) los puedo visualizar correctamente en el navegador, sin embargo en phpmyadmin aparecen distorsionado.

    Si no fuera que la copia de seguridad me viene con los signos bárbaros me conformaría con lo que hay, pero me temo que un día me dará problema.

    He probado con varios ordenadores y sistemas operativos, es lo mismo.
    El servidor es dedicado con CENTOS5, PHP5.1 y Plesk 9.1

    No se si alguien tendrá idea.

    • #2 by Emilio González Montaña on 2009/10/01 - 15:14

      Hola Juan,

      Lo único que se me ocurre si te ha fallado todo lo demás es que hagas lo siguiente:
      – Haz un backup de la base de datos a un fichero SQL en modo texto.
      – Hazte un script que te busque y reemplace todos los posibles caracteres inválidos al nuevo formato.
      – Importar el fichero ya reemplazado en una base de datos con la codificación apropiada.

      Si lo del script te es complicado, siempre puedes usar un editor de textos e ir reemplazando cada tipo de caracter (suelen incluir una opción llamada “Reemplazar todas las ocurrencias”).

      Ya sé que no es lo más bonito, ni automático, pero a mi me ha tocado hacerlo alguna que otra vez… es una solución fea pero funciona.

(No será publicado)