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 normalmente 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:
Backup de BD vieja
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.
Crear la BD nueva
Crear una base de datos vacía con codificación de caracteres UTF8:
mysql -u <usuario_BD> -p
CREATE DATABASE <nombre_BD_utf8> \
CHARACTER SET utf8 COLLATE \
utf8_general_ci;
quit
Convertir formato e importar
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
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
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
Referencias
Enlaces a información de interés sobre el tema: