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