Que signifient exactement le jeu de caractères et le classement?

316

Je peux lire la documentation MySQL et c'est assez clair. Mais comment décider quel jeu de caractères utiliser? Sur quelles données le classement a-t-il un effet?

Je demande une explication des deux et comment les choisir.

Sander Versluys
la source

Réponses:

512

Depuis les documents MySQL :

Un jeu de caractères est un ensemble de symboles et d'encodages. Un classement est un ensemble de règles permettant de comparer des caractères dans un jeu de caractères. Précisons la distinction avec un exemple de jeu de caractères imaginaire.

Supposons que nous ayons un alphabet à quatre lettres: «A», «B», «a», «b». Nous donnons à chaque lettre un nombre: 'A' = 0, 'B' = 1, 'a' = 2, 'b' = 3. La lettre 'A' est un symbole, le nombre 0 est le codage pour 'A' et la combinaison des quatre lettres et de leurs encodages est un jeu de caractères.

Supposons maintenant que nous voulons comparer deux valeurs de chaîne, «A» et «B». La façon la plus simple de le faire est de regarder les encodages: 0 pour «A» et 1 pour «B». Parce que 0 est inférieur à 1, nous disons que «A» est inférieur à «B». Maintenant, ce que nous venons de faire, c'est d'appliquer un classement à notre jeu de caractères. Le classement est un ensemble de règles (une seule règle dans ce cas): "comparer les encodages". Nous appelons ce classement le plus simple de tous les classements possibles un classement binaire.

Mais que se passe-t-il si nous voulons dire que les lettres minuscules et majuscules sont équivalentes? Nous aurions alors au moins deux règles: (1) traiter les lettres minuscules «a» et «b» comme équivalentes à «A» et «B»; (2) puis comparez les encodages. Nous appelons cela un classement insensible à la casse. C'est un peu plus complexe qu'un classement binaire.

Dans la vraie vie, la plupart des jeux de caractères ont de nombreux caractères: pas seulement `` A '' et `` B '' mais des alphabets entiers, parfois plusieurs alphabets ou des systèmes d'écriture orientaux avec des milliers de caractères, ainsi que de nombreux symboles spéciaux et signes de ponctuation. Toujours dans la vie réelle, la plupart des classements ont de nombreuses règles: non seulement l'insensibilité à la casse mais aussi l'insensibilité à l'accent (un "accent" est une marque attachée à un caractère comme en allemand 'ö') et des mappages à plusieurs caractères (comme la règle qui ' ö '=' OE 'dans l'un des deux classements allemands).

Dan Esparza
la source
206

Un codage de caractères est un moyen de coder des caractères afin qu'ils tiennent en mémoire. Autrement dit, si le jeu de caractères est ISO-8859-15, le symbole de l'euro, €, sera codé en 0xa4, et en UTF-8, ce sera 0xe282ac.

Le classement est de savoir comment comparer les caractères, en latin9, il y a des lettres car e é è ê f, si elles sont triées par leur représentation binaire, cela ira e f é ê èmais si le classement est défini, par exemple, en français, vous les aurez dans l'ordre que vous pensiez qu'elles serait, qui est tous e é è êégaux, et puis f.

tapis
la source
5
Il est important de noter qu'il peut y avoir de nombreux classements différents pour un seul jeu de caractères. Celui qui est "correct" dépend de la sémantique du texte qui est normalement déterminée par la langue dans laquelle il est écrit.
Phil
20

Un jeu de caractères est un sous-ensemble de tous les glyphes écrits. Un codage de caractères spécifie comment ces caractères sont mappés à des valeurs numériques. Certains encodages de caractères, comme UTF-8 et UTF-16, peuvent encoder n'importe quel caractère dans le jeu de caractères universel. D'autres, comme US-ASCII ou ISO-8859-1, ne peuvent coder qu'un petit sous-ensemble, car ils utilisent respectivement 7 et 8 bits par caractère. Étant donné que de nombreuses normes spécifient à la fois un jeu de caractères et un codage de caractères, le terme "jeu de caractères" est souvent substitué librement à "codage de caractères".

Un classement comprend des règles qui spécifient comment les caractères peuvent être comparés pour le tri. Les règles de classement peuvent être spécifiques aux paramètres régionaux: l'ordre correct de deux caractères varie d'une langue à l'autre.

Le choix d'un jeu de caractères et d'un classement revient à savoir si votre application est internationalisée ou non. Sinon, quelle région ciblez-vous?

Afin de choisir le jeu de caractères que vous souhaitez prendre en charge, vous devez considérer votre application. Si vous stockez des entrées fournies par l'utilisateur, il peut être difficile de prévoir tous les paramètres régionaux dans lesquels votre logiciel sera éventuellement utilisé. Pour les prendre en charge tous, il peut être préférable de prendre en charge l'UCS (Unicode) dès le départ. Cependant, cela a un coût; de nombreux caractères d'Europe occidentale nécessiteront désormais deux octets de stockage par caractère au lieu d'un.

Le choix du bon classement peut améliorer les performances si votre base de données utilise le classement pour créer un index et utilise ensuite cet index pour fournir des résultats triés. Cependant, étant donné que les règles de classement sont souvent spécifiques aux paramètres régionaux, cet index sera sans valeur si vous devez trier les résultats selon les règles d'un autre paramètre régional.

erickson
la source
désolé mec je suis juste débutant et j'ai juste besoin de votre clarification. Donc, puis-je comprendre le classement comme celui-ci, c'est ce qui garantit que chaque caractère (latin ou chinois) est correctement reconnu et reçoit des encodages respectifs. Est-ce exact? J'espère pour votre réponse
Mirich
1
@Mirich Non, le classement est une information sur la façon de trier les caractères. Différentes régions du monde préfèrent trier les caractères de différentes manières.
erickson
3

Je suggère d'utiliser utf8mb4_unicode_ci, qui est basé sur la norme Unicode pour le tri et la comparaison, qui trie avec précision dans un très large éventail de langues.

simhumileco
la source
3
de l'OP: "Je demande une explication des deux et comment les choisir"
Dan Esparza
1
@simhumileco, désolé mec je suis juste débutant et j'ai juste besoin de votre clarification. Donc, puis-je comprendre le classement comme celui-ci, c'est ce qui garantit que chaque caractère (latin ou chinois) est correctement reconnu et reçoit des encodages respectifs. Est-ce exact? J'espère pour votre réponse
Mirich
1
@Mirich Tout dépend de l'encodage que vous utilisez dans d'autres endroits, si vous utilisez l' UTF-8encodage dans un système en dehors de la base de données, alors tout dans la base de données devrait également être correctement écrit si vous utilisez utf8mb4dans MySQL . En ce qui concerne le bon fonctionnement du tri, de la comparaison et de la transformation de texte pour des caractères spécifiques dans MySQL , il est difficile de trouver la solution parfaite, mais *_unicode_cic'est certainement mieux que *_general, mais cela a aussi ses inconvénients. Veuillez lire: dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html
simhumileco