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:
muy util y muchas gracias por el procedimiento, ahora lo probare y seguro que va de lujo, dale las gracias a tu colega xD
Publicar un comentario