Qu'est-ce que jeu de caractères et collation signifie exactement?
-
19-08-2019 - |
Question
Je peux lire la documentation sur MySQL et c’est très 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.
La solution
À partir de MySQL docs :
Un jeu de caractères est un ensemble de symboles. et des encodages. Un classement est un ensemble de règles de comparaison des caractères dans un jeu de caractères. Faisons le distinction claire avec un exemple de un jeu de caractères imaginaires.
Supposons que nous ayons un alphabet avec quatre lettres: "A", "B", "a", "b". nous attribuez à chaque lettre un chiffre: '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 leur encodings est un jeu de caractères.
Maintenant, supposons que nous voulions comparer deux valeurs de chaîne, 'A' et 'B'. le moyen le plus simple de le faire est de regarder les encodages: 0 pour 'A' et 1 pour 'B'. Parce que 0 est inférieur à 1, on dit "A" est inférieur à "B". Maintenant, qu'est-ce que nous avons vient de faire est d'appliquer une collation à notre jeu de caractères. La collation est un ensemble de règles (une seule règle dans ce cas): " comparer les encodages. " Nous appelons cela le plus simple de tous les collations possibles a classement binaire.
Mais si nous voulons dire que le les lettres minuscules et majuscules sont équivalent? Ensuite, nous aurions à moins deux règles: (1) traiter les lettres minuscules 'a' et 'b' comme équivalent à 'A' et 'B'; (2) alors comparer les encodages. Nous appelons cela un classement insensible à la casse. C'est un un peu plus complexe qu'un binaire classement.
Dans la vie réelle, la plupart des jeux de caractères ont beaucoup de caractères: pas seulement 'A' et 'B' mais des alphabets entiers, parfois alphabets multiples ou écriture orientale systèmes avec des milliers de caractères, avec de nombreux symboles spéciaux et signe de ponctuation. Aussi dans la vraie vie, la plupart des collations ont de nombreuses règles: non juste insensibilité à la casse, mais aussi insensibilité aux accents (un "accent" est un marque attachée à un personnage comme dans Allemand '& # 246;') et plusieurs caractères mappages (tels que la règle selon laquelle '& # 246;' = 'OE' dans l'un des deux allemand classements).
Autres conseils
Un codage de caractères est un moyen de coder les caractères de manière à ce qu'ils tiennent dans la mémoire. En d’autres termes, si le jeu de caractères est ISO-8859-15, le symbole de l’euro, & # 8364 ;, sera codé en tant que 0xa4 et, dans UTF-8, il s’agira de 0xe282ac.
Le classement est comment comparer des caractères. En latin9, il existe des lettres sous la forme e & # 233; & # 232; & # 234; f
, si trié par leur représentation binaire, il ira e f & # 233; & # 234; & # 232;
mais si le classement est défini, par exemple, sur Français, vous les aurez dans l'ordre que vous pensiez être, ce qui correspond à e & # 233; & # 232; & # 234;
sont égaux, puis f
.
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 codages de caractères, tels que UTF-8 et UTF-16, peuvent coder n’importe quel caractère du 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 à l'environnement local: l'ordre correct de deux caractères varie d'une langue à l'autre.
Le choix d'un jeu de caractères et du classement dépend de l'internationalisation de votre application. Si non, quels sont les paramètres régionaux que vous ciblez?
Pour choisir le jeu de caractères que vous souhaitez prendre en charge, vous devez prendre en compte 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 tous en charge, il serait peut-être préférable de prendre en charge UCS (Unicode) dès le début. 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 classement approprié peut améliorer les performances si votre base de données utilise ce classement pour créer un index, puis utilise cet index pour fournir des résultats triés. Toutefois, les règles de classement étant souvent spécifiques à l'environnement local, cet index n'aura aucune valeur si vous devez trier les résultats en fonction des règles d'un autre environnement local.
Je suggère d'utiliser utf8mb4_unicode_ci
, basé sur la norme Unicode pour le tri et la comparaison, qui effectue un tri précis dans un très grand nombre de langues.