Cambiando el collation en MySQL (migrando Moodle =2.0)

Esta semana decidí migrar algunos sistemas Moodle que uso habitualmente. El de moodle.rvg.ua.es que usamos para un curso de formación en la Universidad y el de www.proweb.ua.es/moodle del curso de Experto en Programación Web 2.0. Este proceso de migración es un poco delicado, por cosas que poco tienen que ver con Moodle. Voy a poner lo que más trabajo me ha dado, que también puede servir para otros problemas, no sólo Moodle.

En una base de datos (por ejemplo, MySQL, se usan los juegos de caracteres (Character set) para las tablas y los campos cuyo tipo sea carácter. No elegir un buen juego de caracteres puede llevar a que (lo más habitual) no se vean bien los acentos en castellano. Pero también hay que tener cuidado con los collations (cotejamientos). Estos collations son un juego de reglas para comparar caracteres de un juego de caracteres (perdón por la redundancia). El hecho es que dan bastantes quebraderos de cabeza y alguna vez puede ser útil cambiarlos. Voy a explicar aquí una manera sencilla de hacerlo, ya que no me quedó más remedio al actualizar la versión de Moodle.

Resulta que Moodle, a partir de su versión 2.0 (yo instalé la 2.1+) usa, para todas sus tablas y columnas con texto, el collation utf8_unicode_ci y las tablas antiguas tenían utf8_general_ci y son incompatibles!!. Nada más empezar a instalar me salió un mensaje de error donde me lo decía. Moodle tiene muchísimas tablas y no me planteé hacer el cambio una a una. En este artículo encontraréis el código PHP necesario para cambiar todas las tablas de una sola vez :-).

Yo era feliz, qué bueno, en dos minutos todo cambiado. JA! No sé bien porqué algunas columnas quedaron todavía con el utf8_general_ci y me empezó a dar problemas cuando intentaba actualizar, ya que mezclaba collations. No me quedó más remedio (ya no quise buscar más, eran dos tablas) que instalar PhpMyAdmin y cambiar a mano las tablas que me daban problema. El error que me daba era algo como esta salida que pongo más abajo. Simplemente hay que comprobar si alguna de las tablas implicadas tiene alguna columna en formato utf8_general_ci y cambiarlo por utf8_unicode_ci.

Error reading from databaseMore information about this error
Debug info: Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '='
SELECT po.id AS oldpage_id, po.pagename AS oldpage_pagename, po.version, po.flags,
 po.content, po.author, po.userid AS oldpage_userid,  po.created, po.lastmodified, po.refs, po.meta, po.hits, po.wiki,
 p.id AS newpage_id, p.subwikiid, p.title,  p.cachedcontent, p.timecreated, p.timemodified AS newpage_timemodified,
 p.timerendered, p.userid AS newpage_userid,  p.pageviews, p.readonly, e.id AS entry_id, e.wikiid, e.course AS  entrycourse,
 e.groupid, e.userid AS entry_userid, e.pagename AS entry_pagename, e.timemodified AS entry_timemodified,
 w.id AS wiki_id, w.course AS wiki_course, w.name, w.summary AS summary, w.pagename AS wiki_pagename, w.wtype,
 w.ewikiprinttitle, w.htmlmode, w.ewikiacceptbinary,  w.disablecamelcase, w.setpageflags, w.strippages, w.removepages,
 w.revertchanges, w.initialcontent, w.timemodified AS wiki_timemodified,
 cm.id AS cmid
 FROM mdl_wiki_pages_old po
 LEFT OUTER JOIN mdl_wiki_entries_old e ON e.id = po.wiki
 LEFT OUTER JOIN mdl_wiki w ON w.id = e.wikiid
 LEFT OUTER JOIN mdl_wiki_subwikis s ON e.groupid = s.groupid AND e.wikiid = s.wikiid AND e.userid = s.userid
 LEFT OUTER JOIN mdl_wiki_pages p ON po.pagename = p.title AND p.subwikiid = s.id
 JOIN mdl_modules m ON m.name = 'wiki'
 JOIN mdl_course_modules cm ON (cm.module = m.id AND cm.instance = w.id)
[array (
)]

Tags: ,

  1. Sebastian’s avatar

    Me salvastesss la vidaaaa—-

    Muchas gracias.. Este error me estaba volviendoo locoooo

    Gracias!!!

  2. miguelon’s avatar

    Me alegro que te haya servido. De nada!!!

Reply

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *