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

How to change collation of all rows from latin1_swedish_ci to utf8_unicode_ci?

提问人:Nate 提问时间:8/26/2013 更新时间:1/27/2016 访问量:28276

问:

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

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

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

MySQL 排序规则

评论


答:

44赞 Jon 8/28/2013 #1

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

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;

在上面的查询中,和 将是结果集中的 和 列的值。tcolTEXTTABLE_NAMECOLUMN_NAMEDATA_TYPEINFORMATION_SCHEMA.COLUMNS

评论

0赞 Nate 8/30/2013
谢谢!它效果很好,为我节省了大量时间!
1赞 Sudarshan_SMD 1/27/2016
很好的答案。据我所知,应该使用而不是 ,因为更准确。因此,应推荐使用。stackoverflow.com/questions/766809/......utf8_unicode_ciutf8_general_ciutf8_unicode_ciutf8_unicode_ci
1赞 Jon 1/27/2016
@Sudarshan_SMD你是对的,不知道为什么我使用 general 而不是 unicode,特别是考虑到这个问题说 general,而且现在已经太久了。谢谢你抓住它!
10赞 arnoud 6/25/2014 #2

您实际上可以在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();