PRATIQUE OUTILS 
Gérer les collations de MySQL
 
Nécessaires dans le cadre d'applications utilisées à l'international, les collations précisent les règles à appliquer lors de la gestion des contenus. Explications et exemples de requêtes. (18/01/2006)
  Forum

Réagissez dans les forums de JDN Développeurs

Internationalisation et différences de jeux de caractères peuvent mener à des problèmes profonds, durables, et ardus à découvrir. Les conflits entre jeux de caractères peuvent ainsi surgir tardivement, et impliquer deux colonnes, deux tables, ou la base entière.

Le terme collation fait référence au jeu de règles utilisé pour comparer les données stockées dans deux champs texte. Ces règles peuvent comprendre, par exemple et pour certains caractères, l'insensibilité à la casse ou à l'accentuation, ou les correspondances à caractères multiples (selon les collations, "ö" correspond à "oe", "ä" à "ae" ou B à "ss").

MySQL reconnaît ainsi plus 70 collations, s'appliquant à plus de 30 jeux de caractères. Les jeux de caractères reconnus par une version donnée de MySQL, ainsi que les collations par défaut leur correspondant, peuvent être visualisés en lançant la requête SHOW CHARACTER SET;. Pour connaître les collations possibles pour un jeu donné, on utilisera SHOW COLLATION LIKE 'latin1%';.

La définition d'une collation adéquate est donc nécessaire pour toute base, et MySQL ne propose de passer outre la collation par défaut, latin1_swedish_ci, que depuis sa version 4.1. Dans les faits, de nombreux serveurs où la mise à jour n'a pas été faite ne peuvent maîtriser cet aspect important de la gestion de contenu.

Si l'application se cantonne à des utilisateurs anglophones (dont les caractères forment la base du jeu Latin1) ou d'une langue d'Europe de l'Ouest, la collation par défaut ne saurait poser problème. Ces problèmes, on s'en doute, surgissent généralement lorsque la base doit gérer des caractères pour lesquels elle n'a pas été réglée.

Depuis MySQL 4.1, donc, on peut définir le jeu de caractères pour chaque base, table, colonne ou même requête. On pourra réaliser cette définition par défaut, pour chaque table auxquelles on n'aura pas encore assigné de jeu, par le biais du fichier de configuration du serveur mysqld, à savoir my.cnf (ou my.ini sous Windows) :

character-set-server = euckr
collation-server = euckr_korean_ci


Notez que _ci signifie "case insensitive" : la collation ne fait pas la différence entre majuscules et minuscules. Les autres possibilités de terminaison sont _cs (case sensitive), _bin (binaire) ou _uca (collation spécifique à Unicode).

Lors de la création d'une base, on pourra spécifier son jeu de caractères, et donc la collation par défaut qui y est associée, directement dans la requête CREATE :

CREATE DATABASE nomDeLaBase CHARACTER SET utf8;

Si l'on souhaite préciser une collation autre que celle par défaut, on utilisera la directive COLLATE :

CREATE DATABASE nomDeLaBase CHARACTER SET cp1256 COLLATE latin2_czech_ci;

Il en est bien sûr de même pour la création de tables ou de colonnes, ou la sélection de contenu :

CREATE TABLE nomDeLaTable CHARACTER SET latin1 COLLATE latin1_danish_ci;

CREATE TABLE t1 (
  c1 CHAR(10) CHARACTER SET latin1 COLLATE latin1_german1_ci
  ) DEFAULT CHARACTER SET latin2 COLLATE latin2_bin;


SELECT _latin1'chaine' COLLATE latin1_danish_ci;

Enfin, il est possible d'indiquer en cours de fonctionnement que l'on change de jeu de caractères ou de collation, avec la commande SET :

SET NAMES 'utf8';
 
Xavier Borderie, JDN Développeurs
 
 
Accueil | Haut de page