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

Mysql 如何将所有行的排序规则从latin1_swedish_ci更改为utf8_unicode_ci?,mysql,collation,Mysql,Collation,在开发过程中,我无意中对数据库中的所有varchar行使用了默认的latin1_swedish_ci字符编码,我确定这是我一直遇到的字符编码问题的根源。除此之外,现在似乎大多数人都建议使用utf8\uUnicode\uCI 我想将数据库中所有行的字符编码从latin1_swedish_ci转换为utf8_unicode_ci,但我知道的唯一方法是在phpMyAdmin中逐行更改它,这非常耗时 是否有更快的方法,例如可以运行一个查询,将所有varchar/text行的排序规则从latin1\u s

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

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


是否有更快的方法,例如可以运行一个查询,将所有varchar/text行的排序规则从latin1\u swedish\u ci更改为utf8\u unicode\u ci?

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

ALTER TABLE t CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
如果在每列上单独设置字符集,那么在MySql中无法直接在数据库中所有表的所有列上设置字符集,但是您可以用自己选择的语言编写一个小程序来实现这一点

您的程序将查询该表并查看
字符集\u名称
列:

SELECT * FROM `INFORMATION_SCHEMA.COLUMNS`
WHERE TABLE_SCHEMA = 'dbname' AND CHARACTER_SET_NAME = 'latin1'
对于每个结果行,在现场合成并执行一个
altertable
查询非常简单,该查询可以适当地更改字符集和排序规则:

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

在上面的查询
t
col
TEXT
将是
表名
列名
数据类型
列的值,这些列来自
信息模式。列
结果集。

您实际上可以在MySQL内部使用一个过程来完成这项操作

基于。它使用当前数据库,因此请确保使用正确的数据库

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();

非常感谢。它工作得很好,节省了我大量的时间!回答得好。据我所知,应该使用
utf8\u unicode\u ci
而不是
utf8\u general\u ci
,因为
utf8\u unicode\u ci
更准确。因此,建议使用
utf8\u unicode\u ci
@Sudarshan_SMD你是对的,不知道我为什么用通用而不是unicode,特别是考虑到问题是说通用,现在已经太久了。谢谢你抓住它!