【问题标题】:How to change collation of all rows from latin1_swedish_ci to utf8_unicode_ci?如何将所有行的排序规则从 latin1_swedish_ci 更改为 utf8_unicode_ci?
【发布时间】:2013-08-29 01:14:10
【问题描述】:

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

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

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

【问题讨论】:

    标签: mysql collation


    【解决方案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;
    

    在上述查询中,tcolTEXT 将是 INFORMATION_SCHEMA.COLUMNS 结果集中的 TABLE_NAMECOLUMN_NAMEDATA_TYPE 列的值。

    【讨论】:

    • 谢谢!效果很好,为我节省了大量时间!
    • 不错的答案。据我所知,应该使用utf8_unicode_ci 而不是utf8_general_ci,因为utf8_unicode_ci 更准确。所以,应该推荐使用utf8_unicode_cistackoverflow.com/questions/766809/…
    • @Sudarshan_SMD 你是对的,不知道为什么我使用通用而不是 unicode,特别是考虑到问题说通用,现在已经太久了。感谢收看!
    【解决方案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();
    

    【讨论】:

      猜你喜欢
      • 2021-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      • 1970-01-01
      • 2011-06-13
      • 2011-10-09
      相关资源
      最近更新 更多