Interclassement MySQL pour le français

Quel interclassement (dit aussi collation) choisir pour sa base MySQL afin d’y enregistrer des caractères français (entre autres) ?

L’interclassement a deux fonctions :

  1. Permettre l’ordonnancement correct d’une liste de caractères (pour indiquer que le “é” vient après le “e”, ou que les majuscules viennent avant les minuscules, etc)
  2. Permettre de savoir quand un caractère est “équivalent” à un autre (dans les requêtes WHERE que, par exemple, le caractère “e” est équivalent à “E”, “é”, “è” ou “ê”)

Sur fluxbb on retrouve une très bonne explication. Je copie qu’une partie, mais allez lire cet article vraiment complet :

MySQL permet de choisir comment les données seront classées (ORDER BY) par ce qui est appelé une « collation » (COLLATE). Ceci permet de répondre, par exemple, au problème classique de la sensibilité à la casse :

  • Les majuscules doivent-elles précéder les minuscules, ou bien faut-il considérer A et a comme de même valeur ?
  • La sensibilité aux accents : comptent-ils dans le tri ? Font-ils une différence lors de la recherche ?
  • La possibilité qu’un caractère (ligature oe) puisse correspondre à plusieurs (o suivi de e) : c’est ce qu’Unicode appelle « l’expansion ».

Toutes les collations ont un nom qui commence par le jeu de caractère auquel elles sont liées, et se terminent par l’une de ces trois abréviations :

  • _bin comme binary : les caractères sont dans l’ordre de leurs numéros de code (ce qui donne d’abord toutes les majuscules, puis toutes les minuscules, puis les lettres accentuées, en vrac).
  • _cs comme case sensitive : les caractères sont triés selon le ou les langages de référence, mais de manière sensible à la casse.
  • _ci comme case insensitive : idem, mais en ignorant la casse.

Il est possible de définir plusieurs niveaux : de la colonne jusqu’à toute la base de données. Ainsi on peut définir une collation pour une colonne qui sera différente de celle de la table.

Au final, on peut utiliser utf8_unicode_ci : utf8 indique qu’on peut enregistrer une large palette de caractères (on utilisera utf8mb4 si on souhaite enregistrer des émoticones en plus), unicode_ci va permettre un bon tri tout en ignorant la casse.

Leave a Reply

Your email address will not be published. Required fields are marked *

*