Jak zmienić zestawianie wszystkich wierszy z latin1 szwedzkiego ci na utf8 unicode Ci?

Nieświadomie używałem domyślnego kodowania znaków latin1_swedish_ci dla wszystkich wierszy varchar w mojej bazie danych podczas tworzenia i ustaliłem, że jest to główny problem z kodowaniem znaków, który miałem. Poza tym wydaje się, że większość ludzi w dzisiejszych czasach zaleca użycie utf8_unicode_ci.

Chciałbym przekonwertować kodowanie znaków dla wszystkich wierszy w mojej bazie danych z latin1_swedish_ci na utf8_unicode_ci, ale tylko tak Wiem jak to zrobić jest to zmiana wiersz po wierszu w phpMyAdmin, co jest naprawdę czasochłonne.

Czy istnieje szybszy sposób, taki jak zapytanie, które można uruchomić, które zmienia zestawianie wszystkich wierszy varchar / text z latin1_swedish_ci na utf8_unicode_ci?

Author: Nate, 2013-08-26

2 answers

Jeśli kolumny używają domyślnego zestawu znaków tabeli, to konwertuje się tylko jedno zapytanie na tabelę:

ALTER TABLE t CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Jeśli zestaw znaków jest ustawiany indywidualnie na każdej kolumnie, AFAIK nie ma sposobu, aby to zrobić na wszystkich kolumnach wszystkich tabel w bazie danych bezpośrednio w MySql, ale można napisać mały program w wybranym języku, który to robi.

Twój program zapyta o INFORMATION_SCHEMA.COLUMNS tabela i spójrz na kolumnę CHARACTER_SET_NAME:

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

Dla każdego wiersza wyniku jest to trywialne, aby zsyntetyzować i wykonać ALTER TABLE zapytanie w miejscu, które odpowiednio zmienia zestaw znaków i zestawianie:

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

W powyższym zapytaniu t, col i TEXT byłyby wartościami TABLE_NAME, COLUMN_NAME i DATA_TYPE Kolumny z zestawu wyników INFORMATION_SCHEMA.COLUMNS.

 39
Author: Jon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-27 09:36:51

Możesz to zrobić wewnątrz MySQL, używając procedury.

Na podstawie https://stackoverflow.com/a/12718767/1612273 . używa bieżącej bazy danych, więc upewnij się, że robisz to na właściwym!

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();
 9
Author: arnoud,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:33:15