508 votes

Comment convertir le jeu de caractères et la collation d'une base de données MySQL entière en UTF-8 ?

Comment puis-je convertir l'ensemble du jeu de caractères de la base de données MySQL en UTF-8 et la collation en UTF-8 ?

28 votes

Pour les visiteurs ultérieurs : Notez le questions connexes dans la barre latérale et utilisez utf8_unicode_ci no utf8_general_ci .

20 votes

Si vous voulez un support complet de l'UTF-8, vous voudrez probablement aussi utiliser un jeu de caractères de utf8mb4 plutôt que utf8 como utf8 ne prend en charge que le plan multilingue de base, et non la gamme complète. Il nécessite MySQL 5.5.3 ou plus.

6 votes

J'ai oublié de mentionner dans mon commentaire ci-dessus, si vous passez à utf8mb4 vous devrez également changer la collation en utf8mb4_unicode_ci

787voto

BalusC Points 498232

Utilisez le ALTER DATABASE y ALTER TABLE des commandes.

ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Ou si vous êtes toujours sur MySQL 5.5.2 ou plus ancien qui ne supporte pas l'UTF-8 à 4 octets, utilisez utf8 au lieu de utf8mb4 :

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

17 votes

El CONVERT TO La technique suppose que le texte a été correctement stocké dans un autre jeu de caractères (par exemple, latin1), et non altéré (comme des octets UTF-8 entassés dans une colonne latin1 sans conversion en latin1).

1 votes

Cela reconstruit la table, ce qui la rend infaisable sur les grands systèmes de production. S'il est certain que seuls les caractères ASCII sont stockés dans les colonnes latin1, est-il possible de modifier le jeu de caractères/collation de la table sans reconstruire la table ?

0 votes

@Andrew Les grands systèmes de production ont généralement une base de données miroir pour la maintenance.

140voto

newspire Points 1748
  1. Faites une sauvegarde !

  2. Ensuite, vous devez définir les jeux de caractères par défaut sur la base de données. Cette opération ne convertit pas les tables existantes, elle définit uniquement la valeur par défaut pour les tables nouvellement créées.

    ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;
  3. Ensuite, vous devrez convertir le jeu de caractères sur toutes les tables existantes et leurs colonnes. Cela suppose que vos données actuelles sont effectivement dans le jeu de caractères actuel. Si vos colonnes sont définies dans un jeu de caractères mais que vos données sont en réalité stockées dans un autre jeu de caractères, vous devrez vérifier l'option Manuel MySQL sur la façon de gérer cela.

    ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

51 votes

Remarque : ALTER TABLE tablename CHARACTER SET utf8 définit uniquement le jeu de caractères par défaut sur une table qui est utilisé pour les colonnes nouvellement créées. Il ne convertit pas les colonnes existantes qui ont déjà un jeu de caractères.

0 votes

J'aurais dû lire la sauvegarde de la sauvegarde de la sauvegarde d'abord ... mais ma chance était que c'était sur l'environnement de développement. donc mon upvote va à vous !

4 votes

@DominikAngerer : Qu'est-ce qui est cassé ?

85voto

Sur le shell en ligne de commande

Si vous utilisez le shell en ligne de commande, vous pouvez le faire très rapidement. Il suffit de remplir "dbname" :D

DB="dbname"
(
    echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'
    mysql "$DB" -e "SHOW TABLES" --batch --skip-column-names \
    | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;'
) \
| mysql "$DB"

Un seul mot pour un simple copier/coller

DB="dbname"; ( echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'; mysql "$DB" -e "SHOW TABLES" --batch --skip-column-names | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) | mysql "$DB"

2 votes

Pouvez-vous donner plus de détails sur ce que je reçois ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DB="dbname"

0 votes

@4485670 Vous devez exécuter ceci sur le ligne de commande shell . Si vous ne disposez que de la connexion client MySQL, utilisez le code de sdfor ci-dessous.

7 votes

Ce code fonctionne très bien, n'oubliez pas d'ajouter -h [hostname] -u [username] -p [password] après mysql si nécessaire.

73voto

sdfor Points 1527

Vous pouvez créer le sql pour mettre à jour toutes les tables avec :

SELECT CONCAT("ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CHARACTER SET utf8 COLLATE utf8_general_ci;   ",
    "ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  ") 
    AS alter_sql
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = "your_database_name";

Capturez la sortie et exécutez-la.

La réponse d'Arnold Daniels ci-dessus est plus élégante.

0 votes

Pourquoi avez-vous ajouté deux requêtes alter table ? une seule n'est pas suffisante ?

8 votes

@Akshay, bonne question. La première requête alter-table définit la valeur par défaut des nouvelles colonnes, et la deuxième requête alter-table convertit les colonnes existantes.

4 votes

Pour info : selon dev.mysql.com/doc/refman/5.5/fr/alter-table.html Dans la documentation MySQL, la version "CONVERT TO CHARACTER SET" de l'instruction ALTER fait les deux en une seule étape : "Pour changer le jeu de caractères par défaut de la table y toutes les colonnes de caractères (CHAR, VARCHAR, TEXT) vers un nouveau jeu de caractères ...

1voto

user3013048 Points 11

Si vous n'arrivez pas à convertir vos tables ou si votre table est toujours réglée sur un jeu de caractères non-utf8, mais que vous voulez utf8, votre meilleure chance est de tout effacer et de recommencer en spécifiant explicitement :

create database database_name character set utf8;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X