Cambiar a codificación UTF-8 en MySQL
Hace tiempo, cuando entré a trabajar en el proyecto que me encuentro desarrollando en la actualidad, tuve que hacerme cargo de una base de datos bastante grande, y a pesar de que ya habían trabajado con ella tuve que llegar a realizar muchos cambios. Uno de los más importantes ha sido el cambiar la codificación para reconocer caracteres especiales y afines a nuestro idioma.
Al comenzar a indagar descubrí que la base fue creada bajo la codificación latin1 y yo la necesitaba en utf-8 ya que importaba grandes cantidades de información y era obvio que no modificaría dato por dato solo porque no reconocía acentos y eñes, así que me di a la tarea de ver la forma de realizar el cambio.
Afortunadamente la solución fue talachuda pero sencilla así que decidí compartirla aquí para ayudar a todos los que se encuentren en mi lugar, espero sea de ayuda.
Lo primero que deben hacer es entrar a mysql y comprobar cuales son los valores que tenemos determinados, ejecutar la siguientes instrucciones:
mysql> SHOW VARIABLES LIKE 'character_set%'; +--------------------------+----------------------------+ | 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 | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec)
mysql> SHOW VARIABLES LIKE 'collation%'; +----------------------+-------------------+ | Variable_name | Value | +----------------------+-------------------+ | collation_connection | latin1_swedish_ci | | collation_database | latin1_swedish_ci | | collation_server | latin1_swedish_ci | +----------------------+-------------------+ 3 rows in set (0.01 sec)
Como pueden observar, todo está configurado en latin1, por lo que será necesario modificar el archivo de configuración de MySQL (en mi caso ubicado en /etc/mysql/my.cnf) y cambiar las declaraciones bajo las siguientes cabeceras:
[mysqld] default-character-set=utf8 default-collation=utf8_general_ci character-set-server=utf8 collation-server=utf8_general_ci init-connect='SET NAMES utf8'
[client] default-character-set=utf8
Guardan cambios y será necesario reiniciar MySQL:
service mysql restart
Nuevamente ingresen a mysql y ejecuten las instrucciones anteriores, podrán observar que la codificación cambió a utf-8
mysql> SHOW VARIABLES LIKE 'character_set%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec)
mysql> SHOW VARIABLES LIKE 'collation%'; +----------------------+-----------------+ | Variable_name | Value | +----------------------+-----------------+ | collation_connection | utf8_general_ci | | collation_database | utf8_general_ci | | collation_server | utf8_general_ci | +----------------------+-----------------+ 3 rows in set (0.00 sec)
Pero aquí no termina todo, lo maravilloso de este cambio es que a partir de este momento todo lo que se almacene en la base de datos tendrá la nueva codificación, pero lo que ya está almacenado permanecerá igual, al menos que se cambie manualmente, es decir que se modifiquen las especificaciones campo por campo.
Esto se logra con la siguiente instrucción:
mysql> ALTER TABLE table_name CHANGE field_name field_name TYPE CHARACTER SET utf8 COLLATE utf8_general_ci NULL;
Para entender mejor la instrucción anterior les recomiendo consultar el manual de referencia de MySQL que se encuentra en línea, pero en pocas palabras tienes que elegir la tabla que modificarás (table_name), el nombre del campo (primer field_name), el nuevo nombre del campo (segundo field_name) pero puede quedar igual si no se quiere cambiar, el tipo de dato (TYPE) y si puede quedar vacío o no (NULL) todo lo demás queda igual.
Después de hacer este cambio en todos los campos habrán terminado y ahora sí, todos los caracteres raros que se mostraban ya no estarán.
Como les mencioné, es bastante trabajo pero creanme, al final quedarán satisfechos.
Hay otro método que encontré por la red pero que no me convenció mucho, ya que prácticamente es respaldar tu base con la nueva codificación, borrar la base del servidor y volver a crearla con los datos respaldados. La verdad se me hizo un método muy arriesgado y más cuando manejas gran cantidad de datos, por eso busque uno que me convenciera y es el que les mostré aquí.
Espero sea de ayuda para alguien.






















