I moved a Gerrit installation to use MySQL. The tables turned out to be using latin1
encoding.
Here’s a vile concoction, composed of many StackOverflow answers and swamp creatures:
-- update database and each table to use utf8 according to http://stackoverflow.com/a/6115705/39974. -- to apply to each table, used http://stackoverflow.com/a/18294520/39974 -- use utf8_unicode_ci due to: http://stackoverflow.com/a/766996/39974 DELIMITER $$ DROP PROCEDURE IF EXISTS utfAllTables $$ CREATE PROCEDURE utfAllTables() BEGIN DECLARE table_name VARCHAR(256); DECLARE end_of_tables INT DEFAULT 0; DECLARE cur CURSOR FOR SELECT t.table_name FROM information_schema.tables t WHERE t.table_schema = DATABASE() AND t.table_type='BASE TABLE'; DECLARE CONTINUE HANDLER FOR NOT FOUND SET end_of_tables = 1; OPEN cur; tables_loop: LOOP FETCH cur INTO table_name; IF end_of_tables = 1 THEN LEAVE tables_loop; END IF; SET @s = CONCAT('ALTER TABLE `', table_name, '` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;'); PREPARE stmt FROM @s; EXECUTE stmt; END LOOP; CLOSE cur; END $$ DELIMITER ;
Let’s use this stored procedure, and then drop it.
ALTER DATABASE reviewdb CHARACTER SET utf8 COLLATE utf8_unicode_ci; USE reviewdb; CALL utfAllTables; DROP PROCEDURE utfAllTables;
Sadly, it looks like ALTER DATABASE
is not PREPARE
able, nor does it accept a variable or a function
call as its database name. Therefore, I could not pass DATABASE()
here, nor could I move the ALTER DATABASE
statement inside the stored procedure.
–
via blog.vucica.net