martes, 27 de noviembre de 2012

SOLUCIÓN A LOS PROBLEMAS DE CODIFICACIÓN DE CARACTERES EN BASES DE DATOS DE PÁGINAS WEB

Muchos administradores web habrán sufrido en sus carnes los consabidos problemas de codificación de caracteres al migrar sus bases de datos. Aunque existen otras soluciones para evitar este problema, a veces nos encontramos con un sitio en el que la codificación de caracteres está corrompida y no hay manera de restaurar la base de datos. Aquí propongo una solución algo bruta y posiblemente poco elegante, pero que funciona y ha sido probada en varios sitios con resultados exitosos. Implica el manejo de la base de datos MySQL, trabajando directamente o bien a través de PHPMyAdmin.

MUY IMPORTANTE, ANTES QUE NADA UNA COPIA DE SEGURIDAD DE LA BASE DE DATOS.

Esto puede funcionar para cualquier tipo de página que utilice bases de datos, desde cualquier CMS, foro, etc. Yo lo he probado con foros de Invision y PHPBB, entiendo que para otros sistemas como VBulletin, SMF o, Nuke o Joomla también será válido. Puede ser una faena algo laboriosa, pero vale la pena.

La base de este sistema es sustituir los caracteres corrompidos por los válidos utilizando código SQL. En concreto la siguiente sentencia nos será válida para todos los caractéres:

UPDATE nombre_de_tabla SET nombre_de_campo = REPLACE ( nombre_de_campo, 'carácter antiguo', 'caracter nuevo' );

Por lo tanto tendremos que investigar previamente en nuestra base de datos las tablas a modificar y el nombre de los campos donde se encuentra el texto a modificar.

A TENER EN CUENTA: No sé por qué, pero todos los caracteres corrompidos son sustituidos por la letra Ã y otro caracter, por ejemplo, la letra ñ (en este ejemplo que expongo) se corresponde a Ã±. La í (i latina minúscula con tilde) sin embargo (en este ejemplo que expongo) se corresponde con el caracter Ã. Dado que si sustituimos la letra í nos tocará identificar de nuevo el resto de caracteres, ésta debe ser el último caracter a reemplazar.

DE TODAS FORMAS es recomendable antes de nada crear una tabla de prueba y comprobar que todo funciona perfectamente, realizar todas las pruebas y cambios pertinentes antes de proceder a realizar el reemplazo definitivo.

Pasos a seguir:

Utilizar un editor de texto en condiciones, yo uso el Notepad++ para Windows.

Hacer un listado de los caracteres a modificar. Se puede conseguir. Por ejemplo ñ corresponde a la ñ minuscula. Hay que tener en cuenta que hay que cambiar todas las letras acentuadas en mayusculas y minúsculas, las ñ's, las interrogaciones, las comillas y algun que otro simbolo como el € o el $ y la @ o #, %, &. Esto seria lo mas laborioso

Una vez se tengan todas las equivalencias hay que acceder a la base de datos, entrar en las tablas que se deseen modificar, en este caso serian las de posts y topics como minimo. Hay que ir a la seccion SQL y añadir el codigo siguiente, ADAPTANDOLO A LAS CONDICIONES EN CONCRETO DE CADA PÁGINA. En este caso en concreto se introdujeron estos códigos para un foro PHPBB. Ojo con lo dicho antes, la í (i latina con tilde en minúscula) siempre se reemplaza al final, cuando están todos los caracteres cambiados:

UPDATE phpbb_posts SET post_text = REPLACE(post_text, 'á', 'á');
UPDATE phpbb_posts SET post_text = REPLACE(post_text, 'é', 'é');
UPDATE phpbb_posts SET post_text = REPLACE(post_text, 'ó', 'ó');
UPDATE phpbb_posts SET post_text = REPLACE(post_text, 'ú', 'ú');
UPDATE phpbb_posts SET post_text = REPLACE(post_text, 'É', 'É');
UPDATE phpbb_posts SET post_text = REPLACE(post_text, 'Ó', 'Ó');
UPDATE phpbb_posts SET post_text = REPLACE(post_text, 'Ú', 'Ú');
UPDATE phpbb_posts SET post_text = REPLACE(post_text, 'ñ', 'ñ');
UPDATE phpbb_posts SET post_text = REPLACE(post_text, 'Ñ', 'Ñ');
UPDATE phpbb_posts SET post_text = REPLACE(post_text, '¿', '¿');
UPDATE phpbb_posts SET post_text = REPLACE(post_text, '¡', '¡');

UPDATE phpbb_topics SET topic_title = REPLACE(topic_title, 'á', 'á');
UPDATE phpbb_topics SET topic_title = REPLACE(topic_title, 'é', 'é');
UPDATE phpbb_topics SET topic_title = REPLACE(topic_title, 'ó', 'ó');
UPDATE phpbb_topics SET topic_title = REPLACE(topic_title, 'ú', 'ú');
UPDATE phpbb_topics SET topic_title = REPLACE(topic_title, 'É', 'É');
UPDATE phpbb_topics SET topic_title = REPLACE(topic_title, 'Ó', 'Ó');
UPDATE phpbb_topics SET topic_title = REPLACE(topic_title, 'Ú', 'Ú');
UPDATE phpbb_topics SET topic_title = REPLACE(topic_title, 'ñ', 'ñ');
UPDATE phpbb_topics SET topic_title = REPLACE(topic_title, 'Ñ', 'Ñ');
UPDATE phpbb_topics SET topic_title = REPLACE(topic_title, '¿', '¿');
UPDATE phpbb_topics SET topic_title = REPLACE(topic_title, '¡', '¡');

UPDATE phpbb_users SET username = REPLACE(username, 'á', 'á');
UPDATE phpbb_users SET username = REPLACE(username, 'é', 'é');
UPDATE phpbb_users SET username = REPLACE(username, 'ó', 'ó');
UPDATE phpbb_users SET username = REPLACE(username, 'ú', 'ú');
UPDATE phpbb_users SET username = REPLACE(username, 'É', 'É');
UPDATE phpbb_users SET username = REPLACE(username, 'Ó', 'Ó');
UPDATE phpbb_users SET username = REPLACE(username, 'Ú', 'Ú');
UPDATE phpbb_users SET username = REPLACE(username, 'ñ', 'ñ');
UPDATE phpbb_users SET username = REPLACE(username, 'Ñ', 'Ñ');
UPDATE phpbb_users SET username = REPLACE(username, '¿', '¿');
UPDATE phpbb_users SET username = REPLACE(username, '¡', '¡');

UPDATE phpbb_users SET username_clean = REPLACE(username_clean, 'á', 'á');
UPDATE phpbb_users SET username_clean = REPLACE(username_clean, 'é', 'é');
UPDATE phpbb_users SET username_clean = REPLACE(username_clean, 'ó', 'ó');
UPDATE phpbb_users SET username_clean = REPLACE(username_clean, 'ú', 'ú');
UPDATE phpbb_users SET username_clean = REPLACE(username_clean, 'É', 'É');
UPDATE phpbb_users SET username_clean = REPLACE(username_clean, 'Ó', 'Ó');
UPDATE phpbb_users SET username_clean = REPLACE(username_clean, 'Ú', 'Ú');
UPDATE phpbb_users SET username_clean = REPLACE(username_clean, 'ñ', 'ñ');
UPDATE phpbb_users SET username_clean = REPLACE(username_clean, 'Ñ', 'Ñ');
UPDATE phpbb_users SET username_clean = REPLACE(username_clean, '¿', '¿');
UPDATE phpbb_users SET username_clean = REPLACE(username_clean, '¡', '¡');

UPDATE phpbb_posts SET post_subject = REPLACE(post_subject, 'á', 'á');
UPDATE phpbb_posts SET post_subject = REPLACE(post_subject, 'é', 'é');
UPDATE phpbb_posts SET post_subject = REPLACE(post_subject, 'ó', 'ó');
UPDATE phpbb_posts SET post_subject = REPLACE(post_subject, 'ú', 'ú');
UPDATE phpbb_posts SET post_subject = REPLACE(post_subject, 'É', 'É');
UPDATE phpbb_posts SET post_subject = REPLACE(post_subject, 'Ó', 'Ó');
UPDATE phpbb_posts SET post_subject = REPLACE(post_subject, 'Ú', 'Ú');
UPDATE phpbb_posts SET post_subject = REPLACE(post_subject, 'ñ', 'ñ');
UPDATE phpbb_posts SET post_subject = REPLACE(post_subject, 'Ñ', 'Ñ');
UPDATE phpbb_posts SET post_subject = REPLACE(post_subject, '¿', '¿');
UPDATE phpbb_posts SET post_subject = REPLACE(post_subject, '¡', '¡');

Aqui he puesto los nombres de mis tablas y los caracteres que a mi me salian para sustituir, asi como los campos correspondientes. Cada usuario deberá comprobar si esta todo igual en su página y variar lo que fuera pertinente. La conversión se hace en general de manera bastante rápida, todo depende del tamaño de nuestras tablas.

Saludos.          

miércoles, 14 de noviembre de 2012

Convertir a fecha UNIX desde excel

Una pequeña utilidad

Hay veces que puede ser útil pasar una fecha a formato UNIX para una base de datos SQL, una página en PHP, etc. Desde excel es muy sencillo.

Sólo tenemos que tener en las casillas seleccionadas el formato fecha. Desde otras casillas introduciremos la siguiente fórmula para convertir al formato deseado:

=(A1-25569)*86400

Dónde A1 será la casilla donde tenemos la fecha. El número resultante debe ser una cifra positiva de 10 dígitos.

Hay que tener en cuenta que esta conversión nos convertirá sólo la fecha, no la hora.