Как изменить сортировку всех строк с latin1_swedish_ci на utf8_unicode_ci?

Я неохотно использовал кодировку символов latin1_swedish_ci по умолчанию для всех строк varchar в моей базе данных во время разработки, и я решил, что это корень проблем с кодировкой символов, которые у меня были. В дополнение к этому, похоже, большинство людей в эти дни рекомендуют использовать utf8_unicode_ci.

Я хотел бы преобразовать кодировку символов для всех строк в моей базе данных с latin1_swedish_ci в utf8_unicode_ci, но единственный способ, которым я знаю, - это изменить его по строкам в phpMyAdmin, что очень трудоемко.

Есть ли более быстрый способ, например, запрос, который может быть запущен, который изменяет сортировку всех строк varchar/text с latin1_swedish_ci на utf8_unicode_ci?

Ответ 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;

В приведенном выше запросе t, col и TEXT будут значения столбцов TABLE_NAME, COLUMN_NAME и DATA_TYPE из набора результатов INFORMATION_SCHEMA.COLUMNS.

Ответ 2

Фактически вы можете сделать это в MySQL, используя процедуру.

На основе fooobar.com/info/352415/.... Он использует текущую базу данных, поэтому убедитесь, что вы делаете это справа!

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