viernes, 14 de enero de 2011

Cambiar masivamente los collate de MySql

Esto que voy a postear antes tengo que hacer 2 aclaraciones, primero es un plagio J, segundo gracias Diego Giusso (el creador). pero tenía que tenerlo accesible desde cualquier lugar y no solo desde la empresa.

La situación es la siguiente, tengo una base MySql que tienen algunos campos o tablas con un collate y otros con otro, entonces necesito de alguna forma unificarlos. Para esto utilizaremos un procedimiento almacenado, que se puede generar y ejecutar, directamente del browser de MySql.

Bueno acá abajo, copio lo que les decía que “robe”.

Solución masiva con procedimiento almacenado

* Podemos crear el siguiente procedimiento almacenado que nos permite automatizar la conversión de codificación de campos de una base:

DELIMITER ;;

DROP PROCEDURE IF EXISTS actCOLLATE;;

CREATE PROCEDURE actCOLLATE(in base varchar(50), in characterSet varchar(32), in collateNew varchar(32))

BEGIN

DECLARE done INT DEFAULT 0;

DECLARE tabla VARCHAR (50);

DECLARE campo VARCHAR (50);

DECLARE tipo TEXT (50);

DECLARE cursor1 CURSOR FOR SELECT TABLE_NAME, COLUMN_NAME, COLUMN_TYPE FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=base AND NOT CHARACTER_SET_NAME IS NULL AND COLLATION_NAME<>collateNew;

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

OPEN cursor1;

REPEAT

FETCH cursor1 INTO tabla, campo, tipo;

IF NOT done THEN

SET @ddl = CONCAT('ALTER TABLE ', base,'.', tabla, ' MODIFY COLUMN ', campo, ' ', tipo, ' CHARACTER SET ', characterSet, ' COLLATE ', collateNew);

PREPARE STMT FROM @ddl;

EXECUTE STMT;

END IF;

UNTIL done END REPEAT;

CLOSE cursor1;

END;;

* Los parámetros que recibe son: nombre de la base, carácter set (por lo general ‘latin1’), collate (por lo general ‘latin1_general_cs’). Para ejecutarlo simplemente hay que correr desde el browser lo siguiente:

CALL actCOLLATE('mibase','latin1','latin1_general_cs');

* Una vez ejecutado, si se quiere eliminar el procedimiento lo pueden hacer ejecutando:

DROP PROCEDURE actCOLLATE;

1 comentario:

Unknown dijo...

muy util y muchas gracias por el procedimiento, ahora lo probare y seguro que va de lujo, dale las gracias a tu colega xD