web-dev-qa-db-fra.com

Comment changer le classement de toutes les lignes de latin1_swedish_ci à utf8_unicode_ci?

J'ai utilisé par ignorance le codage de caractères latin1_swedish_ci par défaut pour toutes les lignes varchar dans ma base de données pendant le développement et j'ai déterminé que c'est la racine des problèmes de codage de caractères que j'ai rencontrés. En plus de cela, il semble que la plupart des gens recommandent de nos jours d'utiliser utf8_unicode_ci.

Je voudrais convertir le codage de caractères de toutes les lignes de ma base de données de latin1_swedish_ci en utf8_unicode_ci, mais la seule façon que je sache faire est de le changer ligne par ligne dans phpMyAdmin, ce qui prend vraiment beaucoup de temps.

Existe-t-il un moyen plus rapide, comme une requête pouvant être exécutée, qui change le classement de toutes les lignes varchar/text de latin1_swedish_ci à utf8_unicode_ci?

20
Nate

Si les colonnes utilisent le jeu de caractères de table par défaut, il suffit d'une seule requête par table à convertir:

ALTER TABLE t CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Si le jeu de caractères est défini individuellement sur chaque colonne, AFAIK, il n'y a aucun moyen de le faire sur toutes les colonnes de toutes les tables de la base de données directement dans MySql, mais vous pouvez écrire un petit programme dans la langue de votre choix qui le fait.

Votre programme interrogerait INFORMATION_SCHEMA.COLUMNS table et regardez le CHARACTER_SET_NAME colonne:

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

Pour chaque ligne de résultat, il est trivial de synthétiser et d'exécuter un ALTER TABLE requête sur place qui modifie le jeu de caractères et le classement de manière appropriée:

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

Dans la requête ci-dessus, t, col et TEXT seraient les valeurs de TABLE_NAME, COLUMN_NAME et DATA_TYPE colonnes du INFORMATION_SCHEMA.COLUMNS jeu de résultats.

40
Jon

Vous pouvez réellement le faire dans MySQL, en utilisant une procédure.

Basé sur https://stackoverflow.com/a/12718767/161227 . Il utilise la base de données actuelle, alors assurez-vous de le faire sur la bonne!

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
arnoud