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.

posted under , , |

13 comentarios:

Zer0 dijo...

Gracias me servio bastante, justo lo que buscaba :D

Zer0 dijo...

Gracias me servio bastante, justo lo que buscaba :D

Pabloccix dijo...

en [mysqld] es mas facil si solo le ponemos esto:


[mysqld]
character_set_server=utf8


saludos!!
y gracias por el aporte >_<

elhui2 dijo...

Andaba buscando algo asi, muy bueno el tutorial, lo probare!

Lucas dijo...

Muy bueno el POST, pero no me funcionó.
seguro es la versón de mysql.

Versión del servidor: 5.5.28
ME FUNCIONÓ ESTO
http://programadorphp.es/configurar-el-servidor-mysql-con-utf8

Lucas dijo...

Muy bueno el post pero no me funcionó con
Versión del servidor: 5.5.28 de mysql.

Lo modifiqué por:

[mysqld]
character-set-filesystem=UTF8
character-set-server=UTF8
default-collation=UTF8_general_ci
default-character-set=UTF8

[client]
default-character-set=UTF8

[mysqldump]
default-character-set=UTF8


Y LISTO!

Anónimo dijo...

gracias!
por fin un post que funciona! despues de mirar en miles de blogs se agradece uno que vaya bien!
enhorabuena1

Victor Manuel Hernandez dijo...

excelente, acabo de hacerlo en mi wampserver y funciono correctamente.

Rola dijo...

Hola ZETA, he querido contactarme contigo por este post, resulta que agrego las lineas al my.cfg, pero al arrancar de nuevo, me da un error que no puede partir el mysqld... es para alguna versión particular de MySQL Server?

Saludos y gracias.

joudymoha dijo...


شركه مكافحه النمل الابيض بالخبر. لم تعد أعمال التخلص من حشرات المنزل عمليه سهله وغير ضرورية كما يظن البعض ؛ ولكن الأمر أكبر من هذا ؛ يعتبر انتشار الحشرات من أخطر الأشياء التي تنتشر داخل المنازل وتتسبب في إحداث ضررا بها ؛لذلك اهتمت شركتنا كأفضل شركة مكافحه النمل الابيض بالدمام أن تقدم أفضل الإمكانيات التي لديها من أجل شركة مكافحة النمل الابيض بالخبر
من المشاكل التى واجهها الكثير من الناس وارهقو نفسهم كثيراً فى البحث عن افضل شركة مكافحة النمل الابيض بالقطيف ولكن لم يجدو الشركة التى من الممكن ان تؤدى طلبهم أو تقدم لهم حل المشكلة على اكمل وجة وظنهم بأن الشركات هى مجرد شركات وهمية او غير خبيرة بمكافحة النمل ودائماً اردنا ان نبحث ونسال ونتيقن بان هذة الشركة التى اعجبتهم هية متميزة  شركة مكافحة النمل الابيض بالقطيف
مكافحة البق بالدمام عند تعاملكم معها فبالطبع ترون ما يسركم ويبهركم وهذا بسبب الخدمه التي تقوم شركة مكافحة حشرات بالدمام بتقديمها لك ونقوم ايضا بتخليصكم من انزعاج كافه الحشرات الضاره , تقوم شركة رش حشرات بالدمام باعطائك انت ايها العميل نصيحه الا وهي انك اذا كنت تريد التخلص من الحشرات فلابد من ان تعتمد علي شركة الوطنية لمكافحة الحشرات بالمنطقة الشرقية .. شركة مكافحة البق بالقطيف
شركة مكافحة البق بالدمام

Billy. dijo...

Its very informative and definitely it will be useful for many people

cong ty lam phim 3d du an



Unknown dijo...

i like our content thanks for posting i will come back to read this amazing stuff
اغاني مسلسلات رمضان - اغاني- mp3 download - مهرجان - موال - اغاني جديدة

Unknown dijo...

chronic pain treatment
A decent blog dependably thinks of new and energizing data and keeping in mind that understanding I have feel that this blog is truly have each one of those quality that qualify a blog to be an one.I needed to leave a little remark to help you and wish you a decent continuation. Wishing you the good luck for all your blogging endeavors.

Entrada más reciente Entrada antigua Inicio

Frase del Mes

"Sin importar el tamaño de la ciudad o pueblo en donde nacen los hombres o mujeres, ellos son finalmente del tamaño de su obra, del tamaño de su voluntad de engrandecer y enriquecer a sus hermanos"

Ignacio Allende

    Firefox: Seguro y Gratuito



    firefox download button


    We can check your plugins and stuff


    Estadísticas del Blog