如何将所有行的排序规则从latin1_swedish_ci更改为utf8_unicode_ci?

时间:2013-08-26 14:00:12

标签: mysql collation

我无意中在开发过程中对数据库中的所有varchar行使用了默认的latin1_swedish_ci字符编码,并且我已经确定这是我一直遇到的字符编码问题的根源。除此之外,似乎现在大多数人都建议使用utf8_unicode_ci。

我想将数据库中所有行的字符编码从latin1_swedish_ci转换为utf8_unicode_ci,但我知道如何做的唯一方法是在phpMyAdmin中逐行更改,这非常耗时。

是否有更快的方法,例如可以运行的查询将所有varchar / text行的排序规则从latin1_swedish_ci更改为utf8_unicode_ci?

2 个答案:

答案 0 :(得分:39)

如果列使用默认表格字符集,则每个表只需要一个查询进行转换:

ALTER TABLE t CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

如果在每列上单独设置字符集,AFAIK就无法直接在MySql中对数据库中所有表的所有列执行此操作,但您可以使用您选择的语言编写一个小程序

您的程序将查询INFORMATION_SCHEMA.COLUMNS表并查看CHARACTER_SET_NAME列:

SELECT * FROM `INFORMATION_SCHEMA.COLUMNS`
WHERE TABLE_SCHEMA = 'dbname' AND CHARACTER_SET_NAME = 'latin1'

对于每个结果行,在现场合成并执行ALTER TABLE查询是很容易的,这些查询会适当地更改字符集和排序规则:

ALTER TABLE t MODIFY col TEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

在上面的查询t中,colTEXT将是来自TABLE_NAMECOLUMN_NAMEDATA_TYPE列的值INFORMATION_SCHEMA.COLUMNS结果集。

答案 1 :(得分:9)

你可以使用一个程序在MySQL内部实现这一点。

基于https://stackoverflow.com/a/12718767/1612273。它使用当前数据库,因此请确保您在正确的数据库中执行此操作!

delimiter //

DROP PROCEDURE IF EXISTS convert_database_to_utf8 //

CREATE PROCEDURE convert_database_to_utf8()
BEGIN
    DECLARE table_name VARCHAR(255);
    DECLARE done INT DEFAULT FALSE;

    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 done = TRUE;

    OPEN cur;
        tables_loop: LOOP
            FETCH cur INTO table_name;

            IF done THEN
                LEAVE tables_loop;
            END IF;

            SET @sql = CONCAT("ALTER TABLE ", table_name, " CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci");
            PREPARE stmt FROM @sql;
            EXECUTE stmt;
            DROP PREPARE stmt;
        END LOOP;
    CLOSE cur;
END //

delimiter ;
call convert_database_to_utf8();
相关问题