Piste: » Astuces pour l'IPv6 » Sauvegarde automatique d'un serveur MySQL » Utiliser l'UTF8 avec MySQL et PHP

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 :

Vérifier son encodage

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.

Configuration 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 :

Exemple de 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 :

Connexion en PHP

$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'");