web-dev-qa-db-fra.com

Comment changer une table MySQL en UTF-8?

Je sais qu'il existe de nombreux paramètres pour une langue pour une table et une base de données.

J'ai déjà créé la base de données. Je crois que quand je l’ai créé, c’était default/LATIN. Je veux tout changer - je veux dire ... la table et la base de données, en UTF-8

Comment puis je faire ça? Merci.

22
TIMEX
ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8;
49
Developer-Sid

Regardez Utilisez la commande alter pour changer le jeu de caractères .

Autre lien utile: http://dev.mysql.com/doc/refman/5.0/en/charset-table.html

La forme générale est

ALTER DATABASE db_name
    [[DEFAULT] CHARACTER SET charset_name]
    [[DEFAULT] COLLATE collation_name]

et pour une colonne spécifique dans une table

ALTER TABLE column COLLATE utf8_general_ci

4
aioobe

la réponse de aioobe explique comment modifier le jeu de caractères d'une base de données, d'une table ou d'une colonne. Vous devriez garder à l'esprit que

  • la définition du jeu de caractères pour une table spécifie simplement le jeu de caractères par défaut pour les nouvelles colonnes de cette table. Cela ne change pas le jeu de caractères pour les colonnes préexistantes; vous devez créer ces colonnes individuellement, OR si vous souhaitez modifier chaque colonne de type chaîne du tableau en utilisant le même jeu de caractères, vous pouvez utiliser une commande à cette fin: "alter table ... convert to jeu de caractères "( http://dev.mysql.com/doc/refman/5.1/en/alter-table.html )

  • si vous avez déjà des données mal encodées dans une colonne, alors utiliser "alter table ... modify" pour changer de colonne ne résoudra pas tout à fait le problème. Par exemple, si vous stockez des données UTF-8 dans une colonne Latin1 et que vous modifiez directement le jeu de caractères de Latin1 à UTF-8, il sera toujours mal codé par la suite. Ceci peut être contourné en convertissant du latin-1 au UTF-8 via binaire.

4
Philip Eve

1) Jeu de caractères et classement par défaut dans la base de données:

SELECT @@character_set_database, @@collation_database;

Modifié via: ALTER DATABASE CHARACTER SET utf8 COLLATE utf8_general_ci;

2) Jeu de caractères et classement par défaut de la table:

SELECT T.table_name, CCSA.character_set_name 
FROM information_schema.TABLES T, information_schema.COLLATION_CHARACTER_SET_APPLICABILITY CCSA 
WHERE CCSA.collation_name = T.table_collation AND T.table_schema = "YOUR_DB";`

Modifié via: ALTER TABLE [table_name] CHARACTER SET utf8 COLLATE utf8_general_ci

3) Jeu de caractères de colonne et classement:

SELECT c.TABLE_NAME, c.COLUMN_NAME, c.CHARACTER_SET_NAME, c.COLLATION_NAME 
FROM information_schema.COLUMNS c
WHERE c.table_schema = "YOUR_DB";`

Modifié via: ALTER TABLE [table_name] CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci

La troisième exige que vous désactiviez les contrôles de clé étrangère pour la conversion des données. Donc, mettre tout cela ensemble:

DELIMITER //
CREATE PROCEDURE migrate_charset_to_utf8()
  BEGIN
    DECLARE done TINYINT DEFAULT 0;
    DECLARE curr_table VARCHAR(64);

    DECLARE table_cursor CURSOR FOR
    SELECT T.table_name
      FROM information_schema.TABLES T
      WHERE T.TABLE_TYPE = 'BASE TABLE' AND
        T.TABLE_SCHEMA = 'YOUR_DB';
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

    OPEN table_cursor;

    table_loop: LOOP
      FETCH table_cursor INTO curr_table;
      IF done THEN
        LEAVE table_loop;
      END IF;

      # Convert table data(columns) charset
      SET @sql_str1 = CONCAT("ALTER TABLE ", curr_table, " CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci");
      PREPARE stmt1 FROM @sql_str1;
      EXECUTE stmt1;
      DEALLOCATE PREPARE stmt1;

      # Set table's default charset e.g for new columns added
      SET @sql_str2 = CONCAT("ALTER TABLE ", curr_table, " CHARACTER SET utf8 COLLATE utf8_general_ci");
      PREPARE stmt2 FROM @sql_str2;
      EXECUTE stmt2;
      DEALLOCATE PREPARE stmt2;

    END LOOP table_loop;

    CLOSE table_cursor;
  END//

DELIMITER ;


SET @@FOREIGN_KEY_CHECKS = 0;
CALL migrate_charset_to_utf8();
SET @@FOREIGN_KEY_CHECKS = 1;

ALTER DATABASE CHARACTER SET utf8 COLLATE utf8_general_ci;

EDIT: regardez ici à la place

0
Roly