Convertir votre base MySQL en UTF-8

Attention : vous consultez actuellement la documentation dédiée aux versions 1.x de Moodle. La documentation pour les versions 2.x de Moodle est consultable ici : Convertir votre base MySQL en UTF-8 et celle pour Moodle 3.x est consultable là : Convertir votre base MySQL en UTF-8.

Remarque : la traduction de cet article n'est pas terminée. N'hésitez pas à traduire tout ou partie de cette page ou à la compléter. Vous pouvez aussi utiliser la page de discussion pour vos recommandations et suggestions d'améliorations.


Ce document explique comment convertir votre base de données interne de Moodle de l'encodage latin1 vers UTF8. Moodle nécessite maintenant l'encodage UTF8 et ne se mettra pas à jour si ce n'est pas le cas.

Pour plus d'informations sur l'UTF8, vous pouvez lire la documentation sur Unicode.

Pourquoi ?

Vous risquez de voir les erreurs suivantes lorsque vous mettez à jour Moodle.

It is required that you store all your data in Unicode format (UTF-8). New installations must be performed into databases that have their default character set as Unicode. If you are upgrading, you should perform the UTF-8 migration process (see the Admin page).

Vous devez faire 2 choses :

  1. Modifier votre Mysql pour définir utf8 comme jeu de caractères par défaut
  2. Modifier votre base de données pour l'utf8

Jeu de caractères par défaut de Mysql

Moodle nécessite UTF8 afin d'assurer une meilleure prise en charge multilingue et ceci est fait depuis Moodle 1.8. Toutefois, la vérification de l'UTF8 lors de l'installation et de la mise à jour a été mise en œuvre seulement dans Moodle 2.0. Vous risquez de ne pas pouvoir mettre à jour votre base de données si elle n'a pas été créé à l'origine en UTF8 lors de l'installation de Mysql ou parce que vous utilisiez Moodle avant Moodle 1.8 et n'avez pas converti (ou pas complètement) votre base de données.

Il est peut-être intéressant de noter que Mysql n'a rien à voir spécifiquement avec Moodle. C'est un moteur de base de données qui est très largement utilisé dans les projets open source. Votre base de données contient tous les détails sur toutes les choses dans votre Moodle telles que noms d'utilisateur... et des pointeurs vers tous les fichiers qui ont été déposés sur votre Moodle.


Pour définir l'utf8 par défaut pour mysql, vous devez éditer le fichier /etc/my.cnf en y ajoutant/modifiant des lignes comme ce qui suit.

Dans la section client de my.cnf :

  [client]
  default-character-set = utf8

et plus bas dans my.cnf :

  [mysqld]
  default-character-set = utf8
  default-collation = utf8_unicode_ci
  character-set-server = utf8
  collation-server = utf8_unicode_ci

Après avoir fait d'utf8 votre jeu de caractères par défaut, un mysqldump puis une restauration de votre base de données avec l'option --skip-character-set restaurera la base de données avec votre jeu de caractères par défaut défini comme utf8.

utf8_unicode et utf8_general ne sont pas les mêmes, mais similaires. La différence est décrite dans la page de documentation Unicode.


Les descriptions des sections suivantes expliquent comment migrer votre base de données Moodle vers l'utf8 avec mysqldump.

Convertir une base de données vide

Si vous avez créé votre base de données et que vous recevez le message d'erreur lors de l'installation initiale de votre base de données Moodle, celle-ci est encore vide. Vous pouvez simplement lancer la requête ci-dessous dans votre base de données pour résoudre le problème :

ALTER DATABASE mydatabasename charset=utf8;

Convertir une base de données contenant des tables

Si vous avez déjà installé Moodle et obtenez maintenant l'erreur, le processus suivant vous permettra de convertir votre base de données.

Linux & Mac

mysqldump -uusername -ppassword -c -e --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database -B dbname > dump.sql
cp dump.sql dump-fixed.sql
vim dump-fixed.sql
:%s/DEFAULT CHARACTER SET latin1/DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci/
:%s/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/
:wq
mysql -uusername -ppassword < dump-fixed.sql

ou si vous préférez utiliser sed :

#  $1-dbusername $2-password $3-dbname
mysqldump -u$1 -p$2 -c -e --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database -B $3 > dump.sql
sed 's/DEFAULT CHARACTER SET latin1/DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci/' <dump.sql | sed 's/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/' >dump-fixed.sql
mysql -u$1 -p$2 < dump-fixed.sql

Explications

The following steps will guide you in creating a database dumb, editing the database dump so that the correct charset and collation are used and then restoring the new database.

To start please open a new terminal and move to a temp directory.

mysqldump -uusername -ppassword -c -e --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database -B dbname > dump.sql

The first step is of course to dump out the database and of course we will use mysqldump for this. We do however need to set several arguments in order to clean up the charsets and provide a dump that is not going to cause you any problems if you are moving this database to a different database server or find yourself having to restore on a reverted system.

username 
The username to access your database.
password 
The password for the above user.
-c 
Complete inserts for better compatibility.
-e 
Extended inserts for better performance.
--default-character-set=utf8 
To set the default character set.
--single-transaction 
To reduce our workload if anything goes wrong.
--skip-set-charset 
Obviously not wanted or needed as we are changing it anyway.
--add-drop-database 
Required so we can restore over the top of our existing database.
-B 
We use this option so that our dump will contain drop table and create table syntax (which we will change the syntax for).
dbname 
The name of the database to convert.

When you run this command a database dump will be generated into dump.sql

L'étape suivante est de copier dump.sql vers dump-fixed.sql :

cp dump.sql dump-fixed.sql

Nous ferons les changements souhaités sur dump-fixed.sql et conserverons dump.sql tel quel comme une sauvegarde au cas où.

vim dump-fixed.sql
:%s/DEFAULT CHARACTER SET latin1/DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci/
:%s/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/
:wq

Now we need to edit the dump and correct the incorrect charsets that have been used. I have chosen to do this with VIM however you can use any search+replace editor or program. ( I choose VIM for this only because every linux user is/should be familiar with it).

First we open the file using VIM, and then run the three commands.

The first command replaces all instances of DEFAULT CHARACTER SET latin1 with DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci. This is used to fix up the database's default charset and collation.

The second command replaces all instances of DEFAULT CHARSET=latin1 with DEFAULT CHARSET=utf8. This converts all tables from using latin1 to using UTF8.

The third command simply saves it and exits.

Maintenant que nous avons apporté les modifications nécessaires nous avons simplement besoin de restaurer la base de données à la place de la base de données existante. Nous pouvons le faire en exécutant la commande suivante :

mysql -uusername -ppassword < dump-fixed.sql

Windows

Quelqu'un familier avec Windows pourrait-il convertir ce qui précède en quelque chose qui fonctionne sur Windows ? Il y a probablement plusieurs arguments supplémentaires pour mysqldump que vous aurez besoin de préciser, notamment le paramètre -r pour éviter les problèmes de saut de ligne du fichier de sortie.

Voir aussi