Blog actualizado

El tiempo que el blog estuvo fuera de servicio -- a pesar de que un plugin mostraba un mensaje raro 😛 --, me permitió corregir algunos detalles de la plantilla, mejorar unos cuantos plugins y principalmente actualizar el blog a WordPress 2.2.2, que entre otras cosas incluye correcciones a otros problemas de seguridad reportados en la versión 2.2.1.

Este proceso fue un poco tedioso, porque a pesar de que todas tablas y campos tenían la codificación adecuada (utf8_general_ci), los datos estaban almacenados en latin1 y como es de suponer, no se mostraban bien cuando en el archivo de configuración se especificaba un valor diferente a ese para DB_CHARSET. Por otro lado, gran parte de las entradas y comentarios del 2004 - 2005 estaban doblemente codificados.

php:
define('DB_CHARSET', 'utf8');

El primer intento para corregir este problema, fue usar el plugin que g30rg3_x hizo, pero en este caso no tuvo ningún efecto porque -- en mi opinión -- MySQL creía que no era necesario hacer nada si la codificación de origen y destino eran las mismas. Luego de unas cuantas modificaciones del plugin y pruebas no satisfactorias, decidí descartarlo porque tampoco me iba ayudar con los datos que tenían doble codificación.

Luego de buscar sin éxito más alternativas, opté por una solución nada elegante pero que finalmente llegó a funcionar 😀 . Lo que hice fue escribir un pequeño script que se encargue de pasar los datos antiguos a una nueva base de datos con la codificación adecuada, esto además me permitió detectar y corregir de manera rústica los elementos que habían sido doblemente codificados.

Entre hoy o mañana, habilitaré un nuevo plugin para hacer pruebas con la publicidad del blog. Si no notan nada extraño, eso quiere decir que está funcionando como debería 😉 , pero si no es así, les pido por favor que me hagan saber los problemas que encuentren.

6 Replies to “Blog actualizado”

  1. Bueno alex que puedo decirte...

    Primero preguntarte que paso por que hace unas horas decia que dejabas de bloguear :S que por que no te pudiste hacer millonario asi que me es raro ver esta nota por que ya te creia muerto XDDD

    Segundo con lo de plugin estoy desde hace un par de semanas investigando y mitigando, la mayoria de los problemas provienen de aquellos plugin que han añadido un indice de tipo Full Text a ciertos campos, plugins como el de relacionados (que veo que tienes) y otros de la misma rama modifican la base de datos para añadir este tipo indice y es precisamente este indice el que trae problemas ya que no permite convertir de manera adecuada y ocasiona un error interno, la solucion es obvio quitar el campo Full text, hacer la conversion y luego volverlo a poner, esta labor ya esta siendo elaborada (puedes verla en el svn del plugin) y solo me encuentro en la fase de resolver problemas de incompatibilidades con mysql 4 y 5 y ya del esting, si me quieres ayudar colaborando con una zona de pruebas te lo agradeceria...

    Tercero vaya si que es rustico y cansado debio ser ese script pero bueno al final se logro la labor...

    Y si esparamos que vuelva tu blog, sobre todo por que pones buenas notas...

    Saludos

  2. Primero preguntarte que paso por que hace unas horas decia que dejabas de bloguear :S que por que no te pudiste hacer millonario asi que me es raro ver esta nota por que ya te creia muerto XDDD

    El mensaje que estaba visible sólo era una broma, había otro mensaje -- oculto -- que indicaba que el sitio estaba en mantenimiento. 😀

    Sobre el plugin, como comenté todas las tablas y campos de la base de datos antigua supuestamente tenían codificación utf8_general_ci, sólo la tabla posts tiene el tipo de índices que mencionas, pero luego de correr el plugin no había ningún cambio (ni en la tabla post ni en las demás tablas).

    ...solo me encuentro en la fase de resolver problemas de incompatibilidades con mysql 4 y 5 y ya del esting, si me quieres ayudar colaborando con una zona de pruebas te lo agradeceria…

    Si me comentas más detalles en alex arroba buayacorp punto com con gusto ayudaré, es más, tu plugin me está siendo muy útil en una migración que estoy ayudando a hacer 😉

    Tercero vaya si que es rustico y cansado debio ser ese script pero bueno al final se logro la labor…

    El script, como puedes ver es simple e ineficiente, pero principalmente me sirvió para corregir el problema de doble codificación que tenía -- causado por actualizaciones mal hechas en años anteriores -- en entradas y comentarios.

    php:

    <?php
    header('Content-Type: text/plain; charset=utf-8;');
    require './db.php';

    set_time_limit(0);

    $new = new wpdb('usuario1', 'pass1', 'new', 'localhost');
    $old = new wpdb('usuario2', 'pass2', 'old', 'localhost');

    $new->query("SET NAMES 'utf8'");

    $accents = array('a'=>'á','e'=>'é','i'=>'í','o'=>'ó','u'=>'ú','A'=>'Á','E'=>'É','I'=>'Í','O'=>'Ó','U'=>'Ú','n'=>'ñ','N'=>'Ñ', '¿', '¡');

    $regex = utf8_encode('~' . join('|', $accents) . '~u');
    $tables = $old->get_col("SHOW TABLES");
    foreach ($tables as $table) {
            $data = $old->get_results("SELECT * FROM $table", ARRAY_A);
            $columns = $old->get_col_info();
            $types = $old->get_col("EXPLAIN $table", 1);
           
            foreach ($data as $item) {           
                    $sql = "INSERT INTO $table VALUES (";
                    foreach ($columns as $k => $v) {
                            if ( preg_match('/char|text|enum|set/', $types[$k]) ) {
                                    if ( preg_match($regex, $item[$v], $matches) )
                                            $item[$v] = utf8_decode($item[$v]);
                                    $item[$v] = preg_replace('~&#038;([a-un])(acute|tilde);~ie', '$accents[1]', $item[$v]);
                            }
                            $sql .= "'" . $new->escape($item[$v]) . "',";
                    }
                    $sql = rtrim($sql, ',') . ')';
                    $new->query($sql);
            }       
    }
    ?>

    Saludos

  3. Bueno el problema que veo es exactamente como lo describiste el CONVERT TO no realiza ninguna accion ya que para el ya eres UTF-8 (al parecer) pero como dices tu problema viene en los collation internos de cada tabla...
    Como te apunte y te dije el problema de los FullText es solo 1 de los varios, como creo que di a entender la mayoria de los problemas surgen en incompatibilidades entre MySQL 4 y 5 que afectan en el modus operandi de mi plugin...

    Claro tengo todo un paquete ya que tengo que encontrar la solucion mas general algo por demas trabajoso y costoso que hago con toda caridad sin esperar que alguien me page, pero bueno gracias por ofrecer te contactare cuando acabe la ultima, por ahora sigo testeando resolviendo problemas y estoy seguro que la siguiente version disminuiara el numero de casos de trabajos erroneos, aunque bueno el numero de quejas es solo un 5% con lo cual sigue estando la version actual en un numero bastante alto...

    Saludos

Comments are closed.