web-dev-qa-db-fra.com

Différence entre les collations utf8mb4_unicode_ci et utf8mb4_unicode_520_ci dans MariaDB/MySQL?

Je me suis connecté à MariaDB/MySQL et j'ai entré:

SHOW COLLATION;

Je vois utf8mb4_unicode_ci et utf8mb4_unicode_520_ci parmi les classements disponibles. Quelle est la différence entre ces deux collations et lequel devrions-nous utiliser?

23
Flux

Vous aurez besoin de lire la documentation. Je ne peux pas vous dire ce que vous devriez utiliser car chaque projet est différent. 

10.1.3 Conventions de dénomination des collations

Les noms de classement MySQL suivent ces conventions:

Un nom de classement commence par le nom du jeu de caractères auquel il est associé, suivi d'un ou de plusieurs suffixes indiquant d'autres caractéristiques de classement. Par exemple, utf8_general_ci et latin_swedish_ci sont des classements pour les jeux de caractères utf8 et latin1, respectivement.

Un classement spécifique à une langue inclut un nom de langue. Par exemple, utf8_turkish_ci et utf8_hungarian_ci trient les caractères du jeu de caractères utf8 en utilisant respectivement les règles turque et hongroise.

La sensibilité à la casse pour le tri est indiquée par _ci (insensible à la casse), _cs (sensible à la casse) ou _bin (binaire; les comparaisons de caractères sont basées sur des valeurs de code binaire de caractères). Par exemple, latin1_general_ci ne respecte pas la casse, latin1_general_cs est sensible à la casse et latin1_bin utilise des valeurs de code binaire.

Pour Unicode, les noms de classement peuvent inclure un numéro de version pour indiquer la version de l'algorithme de classement Unicode (UCA) sur lequel est basé le classement. Les classements basés sur UCA sans nom de version dans le nom utilisent les clés de pondération UCA version 4.0.0. Par exemple:

utf8_unicode_ci (sans version nommée) est basé sur les clés pondérées UCA 4.0.0> ( http://www.unicode.org/Public/UCA/4.0.0/allkeys-4.0.0.txt ).

utf8_unicode_520_ci est basé sur les clés de pondération UCA 5.2.0 ( http://www.unicode.org/Public/UCA/5.2.0/allkeys.txt ).

Pour Unicode, les classements xxx_general_mysql500_ci conservent l'ordre antérieur à 5.1.24 des classements d'origine xxx_general_ci et autorisaient les mises à niveau pour les tables créées avant MySQL 5.1.24. Pour plus d'informations, reportez-vous à la Section 2.11.3, «Vérification de la nécessité de reconstruire les tables ou les index» et à la Section 2.11.4, «Reconstruction ou réparation de tables ou d'index».

Source: https://dev.mysql.com/doc/refman/5.6/en/charset-collation-names.html

27
StuiterSlurf

Pour voir un peu plus de détails sur les différences réelles, vous pouvez aller à https://dev.mysql.com/worklog/task/?id=2673 et cliquer sur "Architecture de haut niveau".

4
Peter Gulutzan

Je vais développer @StuiterSlurf répondre et me concentrer sur les détails de utf8mb4_unicode_ciutf8mb4_unicode_520_ci:

Comme vous pouvez le lire ici (_/Peter Gulutzan), il y a un problème de tri/comparaison de la lettre polonaise "Ł" (L avec trait) (minuscule: "ł"; html esc: ł et Ł) - nous avons l'hypothèse suivante en codant: 

utf8_polish_ci      Ł greater than L and less than M
utf8_unicode_ci     Ł greater than L and less than M
utf8_unicode_520_ci Ł equal to L
utf8_general_ci     Ł greater than Z

En polonais, la lettre Ł est après la lettre L et avant M. Et pour différents systèmes de codage, vous obtiendrez des résultats de tri différents. Aucun de ces codages n'est meilleur ou pire - cela dépend de vos besoins. 

1
Kamil Kiełczewski