Si vous avez déjà travaillé avec MySQL, vous êtes inévitablement tombé sur des jeux de caractères et des classements. Dans cet article de blog, nous essaierons de vous donner un aperçu plus approfondi de ce que sont ces deux éléments et de la manière dont vous devriez les utiliser.
Que sont les jeux de caractères et les classements ?
En termes simples, les jeux de caractères dans MySQL sont des ensembles de symboles et d'encodages - les classements sont des ensembles de règles permettant de comparer les caractères dans un jeu de caractères. En d'autres termes, les jeux de caractères sont des ensembles de caractères autorisés dans une chaîne, tandis que les classements sont un ensemble de règles utilisées pour comparer les caractères dans un jeu de caractères particulier. Tout comme chaque jeu de caractères a un classement par défaut, les jeux de caractères peuvent également avoir plusieurs classements. MySQL a un jeu de caractères et un classement par défaut pour le serveur ainsi que pour chaque base de données et table.
Jeux de caractères dans MySQL
En général, les jeux de caractères dans MySQL fonctionnent comme suit :
- Lorsqu'une base de données est créée, les jeux de caractères sont dérivés de la variable character_set_server à l'échelle du serveur.
- Lorsqu'une table est créée, les jeux de caractères sont dérivés de la base de données.
- Lorsqu'une colonne est créée, les jeux de caractères sont dérivés de la table.
En ce qui concerne les jeux de caractères, il y a quelques variables sur lesquelles vous devez garder un œil :
- Character_set_client définit le jeu de caractères dans lequel les instructions sont envoyées par le client.
- Character_set_connection définit le jeu de caractères dans lequel les instructions sont traduites après qu'un serveur a reçu une instruction du client.
- Character_set_results définit le jeu de caractères dans lequel le serveur renvoie les résultats de la requête au client.
Ces trois paramètres peuvent être modifiés à l'aide des instructions SET NAMES ou SET CHARACTER SET, ou même dans les fichiers de configuration MySQL.
Lorsque vous traitez avec des jeux de caractères, vous pouvez parfois rencontrer une erreur #1267 :
ERROR 1267 (HY000): Illegal mix of collations.
L'erreur ci-dessus est généralement causée par la comparaison de deux chaînes qui ont des collations incompatibles ou en essayant de sélectionner des données qui ont une collation différente dans une colonne combinée. L'erreur s'affiche car lorsque MySQL compare deux valeurs avec des jeux de caractères différents, il doit les convertir dans le même jeu de caractères pour la comparaison, mais les jeux de caractères ne sont pas compatibles. Pour résoudre ce problème, assurez-vous que les classements de chaque table et leurs colonnes sont les mêmes.
Collations dans MySQL
Comme déjà mentionné ci-dessus, les classements sont étroitement liés aux jeux de caractères car un classement est un ensemble de règles qui définissent comment comparer et trier les chaînes de caractères. Chaque jeu de caractères a au moins un classement, certains en ont également plus.
Bien que nous n'entrions pas dans les moindres détails de toutes les choses liées au classement dans MySQL dans ce billet de blog, il y a certaines choses que vous devez savoir :
- Si vous utilisez MySQL 5.7, le classement MySQL par défaut est généralement latin1_swedish_ci car MySQL utilise latin1 comme jeu de caractères par défaut. Si vous utilisez MySQL 8.0, le jeu de caractères par défaut est utf8mb4.
- Si vous choisissez d'utiliser UTF-8 comme classement, utilisez toujours utf8mb4 (en particulier utf8mb4_unicode_ci). Vous ne devez pas utiliser UTF-8 car l'UTF-8 de MySQL est différent de l'encodage UTF-8 approprié. C'est le cas car il n'offre pas de prise en charge complète de l'unicode, ce qui peut entraîner une perte de données ou des problèmes de sécurité. Gardez à l'esprit que utf8mb4_general_ci est un ensemble simplifié de règles de tri qui prend des raccourcis conçus pour améliorer la vitesse tandis que utf8mb4_unicode_ci trie avec précision dans un large éventail de langues. En général, utf8mb4 est le jeu de caractères "le plus sûr" car il prend également en charge l'unicode à 4 octets, tandis que utf8 n'en prend en charge que jusqu'à 3.
Choisir un bon jeu de caractères et un bon classement
Pour choisir un bon classement et un bon jeu de caractères pour votre jeu de données MySQL, n'oubliez pas de rester simple. Un mélange de jeux de caractères et (ou) de classements différents peut être un vrai gâchis car ils peuvent être très déroutants (par exemple, tout peut bien fonctionner jusqu'à ce que certains caractères apparaissent, etc.) il est donc préférable d'évaluer vos besoins à l'avance et de choisir le meilleur classement et jeu de caractères à l'avance. MySQL propose également quelques requêtes utiles qui peuvent vous aider à faire exactement cela, par exemple
SELECT * FROM information_schema.CHARACTER_SETS ORDER BY CHARACTER_SET_NAME;
renverrait une liste des jeux de caractères et des classements disponibles avec leur description, ce qui peut être extrêmement utile si vous planifiez la conception de votre base de données.
Gardez à l'esprit que certains jeux de caractères peuvent nécessiter plus d'opérations CPU, ils peuvent également consommer plus d'espace de stockage. L'utilisation de jeux de caractères incorrects peut même empêcher l'indexation - par exemple, MySQL doit convertir les jeux de caractères afin de pouvoir les comparer lorsqu'ils ne sont pas identiques :la conversion peut rendre impossible l'utilisation d'un index.
Gardez également à l'esprit que certaines personnes recommandent "d'utiliser simplement UTF-8 globalement" - ce n'est peut-être pas nécessairement une bonne idée car de nombreuses applications n'ont même pas besoin d'UTF-8 du tout et, selon sur vos données, UTF-8 peut causer plus de problèmes qu'il n'en vaut la peine (par exemple, il peut utiliser beaucoup plus d'espace de stockage sur le disque), alors choisissez judicieusement.
Résumé
Les jeux de caractères et les classements peuvent être vos amis ou l'un de vos cauchemars - tout dépend de la façon dont vous les utilisez. En général, gardez à l'esprit qu'un "bon" jeu de caractères et un classement dépendent des données que contient votre base de données - MySQL fournit certaines requêtes pour vous aider à décider quoi utiliser, mais pour que vos jeux de caractères et classements soient efficaces, vous devez également penser quand il est judicieux d'utiliser un certain classement et pourquoi.