web-dev-qa-db-fra.com

Qu'est-ce que jeu de caractères et collation signifie exactement?

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 la collation a-t-elle un effet?

Je demande une explication des deux et comment les choisir.

295
Sander Versluys

Depuis MySQL docs :

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. Faisons la distinction avec un exemple de jeu de caractères imaginaire.

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

Supposons maintenant que nous voulions comparer deux valeurs de chaîne, 'A' et 'B'. La façon la plus simple de procéder consiste à examiner les codages: 0 pour "A" et 1 pour "B". Parce que 0 est inférieur à 1, nous disons "A" est inférieur à "B". Maintenant, ce que nous venons de faire est d’appliquer un classement à 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 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 sans distinction de casse. C'est un peu plus complexe qu'un classement binaire.

Dans la vie réelle, la plupart des jeux de caractères comportent de nombreux caractères: pas seulement les lettres "A" et "B", mais des alphabets entiers, parfois de multiples alphabets ou des systèmes d'écriture orientaux comportant des milliers de caractères, ainsi que de nombreux symboles et signes de ponctuation spéciaux. De plus, dans la vie réelle, la plupart des collations 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 ö '=' OE 'dans l'une des deux collations allemandes).

486
Dan Esparza

Un encodage de caractères est un moyen d'encoder les caractères pour qu'ils tiennent dans la mémoire. Autrement dit, si le jeu de caractères est ISO-8859-15, le symbole de l'euro, €, sera codé en tant que 0xa4 et, en UTF-8, il s'agira de 0xe282ac.

Le classement permet de comparer les caractères. En latin9, il existe des lettres telles que e é è ê f, si elles sont triées en fonction de leur représentation binaire, elles iront e f é ê è, mais si le classement est défini sur Par exemple, en français, vous les aurez dans l'ordre que vous pensiez être, c'est-à-dire que e é è ê sont égaux, puis f.

194
mat

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. Comme 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.

Choisir un jeu de caractères et un classement revient à déterminer si votre application est internationalisée ou non. Si non, quelle locale visez-vous?

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 bon classement peut améliorer les performances si votre base de données utilise ce dernier pour créer un index, puis utilise cet index pour fournir des résultats triés. Cependant, étant donné que les règles de classement sont 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.

20
erickson

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

3
simhumileco