16.Encodage UTF-8 (CHARACTER SET, CHARSET)

16.1.Introduction

Par défaut, les bases, tables et champs créés sur un serveur de base de données MySQL sont encodés[c'est quoi?] en latin1. Si toutes les chaînes de caractères que vous êtes amenés à stocker sont en Français il est probable que cela peut vous convenir mais à partir du moment où vous envisager d'utiliser votre base de données dans un contexte multi-langues (on parle d'internationalisation ou i18n) vous devez penser à utiliser un autre encodage.
Pour pouvoir stocker correctement des caractères aussi "exotiques" et différents que ő ou Š voire des caractères arabes, chinois, etc. et même le caractère utilisé en Français œ, vous devrez opter pour un encodage dit unicode dont le plus couramment utilisé est l'UTF-8.
D'une manière générale même si aujourd'hui vous ne voyez pas l'utilité d'utiliser un encodage autre que le latin1 nous ne pouvons que vous encourager à systématiser l'emploi de l'UTF-8 (rien ne vous dit qu'aucun utilisateur enregistré dans votre base n'aura un nom ne comportant aucun caractère "exotique").
La déclaration ou la modification de l'encodage peut se faire à différents niveaux: Au niveau de la base de données, au niveau de la table ou plus finement encore au niveau du champ.
Avant de procéder à la modification de l'encodage d'un champ vous devrez déterminer si vous souhaiter réaliser cette opération afin de procéder à la correction de chaines de caractères stockées dans un encodage différent de celui déclaré ou bien si vous souhaitez changer le "type" du champ (peut-être en prévisions du stockage futur de caractères "exotiques").
Une fois que l'encodage de votre base sera correctement fixé, il vous faudra vérifier que vous vous y connectez en utilisant le bon encodage (en particulier lorsque vous souhaitez y accéder depuis un script PHP).

16.2.Déclaration de l'encodage UTF-8

16.2.1.Déclaration de l'encodage UTF-8 au niveau de la base de données

Pour créer une base de données en UTF-8 vous devrez executer la commande SQL suivante:
CREATE DATABASE nomdelabase CHARACTER SET utf8
rem
  • La commande en ligne
    mysqladmin create nomdelabase
    ne permet pas de préciser l'encodage de la base (même en ajoutant l'option --default-character-set=utf8 destinée à un autre usage)
Toutes les tables et tous les champs (alphanumériques) de la base seront alors par défaut encodés en UTF8.

16.2.2.Déclaration de l'encodage UTF-8 au niveau de la table

Si vous souhaitez ajouter une table encodée en UTF8 dans une base de données dont l'encodage par défaut est différent vous devrez compléter l'instruction SQL CREATE TABLE[en savoir plus?] comme suit:
CREATE TABLE nomdelatable (....) CHARACTER SET utf8
Tous les champs (alphanumériques) de la table seront alors par défaut encodés en UTF8.

16.2.3.Déclaration de l'encodage UTF-8 au niveau d'un champ d'une table

Si vous souhaitez déclarer un champ encodée en UTF8 dans une table dont l'encodage par défaut est différent vous devrez compléter la déclaration du type SQL comme suit:
CREATE TABLE nomdelatable (..., nomduchamp VARCHAR(longueur) CHARACTER SET utf8, ...)
rem
  • Ceci n'est valable que pour les versions de MySQL >= 4.1

16.3.Modification de l'encodage pour de l'UTF-8

16.3.1.Introduction

Si vous constatez que vous avez dans votre base de données des chaînes de caractère incluant des é à la place des caractères 'é' ou encore des ç à la place de 'ç', c'est probablement parce que vous avez stocké dans votre base des chaînes de caractères encodées en UTF-8 dans des champs déclarés en latin1 (ou un encodage similaire). Il va donc falloir procéder à une correction afin
  • Que ce champ soit désormais déclaré comme contenant des chaînes en UTF-8
  • Que les chaînes déjà stockées au mauvais format soient corrigées au moment de la conversion en UTF-8
Si votre base contient des chaînes de caractères en latin1 dans des champs en latin1 mais que vous souhaitez par la suite pouvoir gérer des chaînes en UTF-8, il vous suffit de déclarer un nouveau encodage et les chaines déjà (correctement) stockées seront converties dans le nouvel encodage.

16.3.2.Modification de l'encodage d'un champ contenant des chaînes au mauvais encodage (i.e. avec des é, ç, etc.)

Dans ce cas, avant de déclarer le nouvel encodage vous devez convertir les champs contenant les valeurs mal encodées, en binaire avec la commande:
ALTER TABLE nomdelatable MODIFY nomduchamp BLOB
Vous pouvez maintenant, procéder au changement de déclaration d'encodage comme décrit dans le paragraphe suivant.

16.3.3.Modification de l'encodage d'un champ

Pour modifier l'encodage d'un champ (contenant des chaînes correctement encodées ou de type BLOB suite à l'opération décrite dans le paragraphe précédent) d'une table donnée, il suffit d'éxecuter la commande suivante:
ALTER TABLE nomdelatable MODIFY nomduchamp typeduchamp CHARACTER SET utf8
Où typeduchamp est CHAR, VARCHAR ou TEXT.

16.4.Déclaration de l'encodage à utiliser lors des accès à la base

Comme vous pouvez le lire plus en détail sur phpfacile, afin que vos données soient correctement stockées et lues dans une base en UTF-8 vous devrez faire appel à une fonction permettant de définir quel encodage doit être utilisé pour les échanges avec la base de données[comment?].