Utiliser l'UTF8 avec MySQL et PHP

MySQL

Par défaut Mysql utilise l'encodage Latin1 et la collation latin1_swedish_ci.

L'encodage indique comment les caractères seront stockés et la collation indique la façon dont ils seront comparés (dans les clauses WHERE).

On peut configurer l'encodage (et la collation) des chaînes de caractères à pratiquement tous les niveaux :

  • serveur
  • client
  • connection
  • database
  • table
  • champs de la table

Pour vérifier quel encodage est utilisé, il faut utiliser les commandes suivantes :

show variables like "%character%";
show variables like "%collation%"; 

Configuration des programmes

L'objectif est de configurer une fois pour toutes, tous les programmes afin qu'ils communiquent en utf8. Pour cela on va ajouter quelques directives de configuration au niveau du fichier my.cnf.

Pour faire propre, on peut ajouter un fichier dédié : /etc/mysql/conf.d/utf8.cnf.

[client]
default-character-set=utf8

[mysqld]
init_connect='SET collation_connection = utf8_general_ci'
init_connect='SET NAMES utf8'
default-character-set=utf8
character-set-server = utf8
collation-server = utf8_general_ci

[mysql]
default-character-set=utf8 

Ajout en SQL

Pour forcer la création d'une table avec l'encodage utf8, il faut ajouter la directive DEFAULT CHARSET :

CREATE TABLE exemple (
  x mediumint(9) NOT NULL,
  nom text,
) DEFAULT CHARSET=utf8;

PHP

Pour s'assurer que la connexion à une base de données MySQL se fait bien en utf8, il faut passer quelques commandes juste après la création de la connexion :

$db = mysql_connect(DB_HOST, DB_USER, DB_PASS);
mysql_select_db(DB_NAME);
mysql_set_charset('utf8', $db);
mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");