web-dev-qa-db-fra.com

Quelles sont les différences entre utf8_general_ci et utf8_unicode_ci?

Duplicata possible:
Quelle est la différence entre utf8_general_ci et utf8_unicode_ci

J'ai deux options pour unicode qui semblent prometteuses pour une base de données mysql.

utf8_general_ci unicode (multilingual), case-insensitive
utf8_unicode_ci unicode (multilingual), case-insensitive

Pouvez-vous expliquer quelle est la différence entre utf8_general_ci et utf8_unicode_ci? Quels sont les effets du choix de l'un sur l'autre lors de la conception d'une base de données?

82
reconbot

utf8_general_ci est un classement très simple - et sur Unicode, très cassé - qui donne des résultats incorrects sur le texte Unicode général. Ce qu'il fait, c'est:

  • convertit en forme de normalisation Unicode D pour la décomposition canonique
  • supprime tous les caractères de combinaison
  • convertit en majuscules

Cela ne fonctionne pas correctement sur Unicode, car il ne comprend pas le boîtier Unicode. Le boîtier Unicode seul est beaucoup plus compliqué qu'une approche compatible ASCII. Par exemple:

  • Les minuscules de "ẞ" sont "ß", mais les majuscules de "ß" sont "SS".
  • Il existe deux sigmas grecs en minuscules, mais un seul en majuscules; considérez "Σίσυφος".
  • Les lettres comme "ø" ne se décomposent pas en un "o" plus un diacritique, ce qui signifie qu'il ne sera pas correctement trié.

Il existe de nombreuses autres subtilités.

  1. utf8_unicode_ci utilise le standard Algorithme de classement Unicode , prend en charge les dénommés extensions et ligatures, par exemple: la lettre allemande ß (U + 00DF LETTER SHARP S) est triée près de "ss" La lettre Œ (U + 0152 LIGATURE CAPITALE LATINE OE) est triée près de "OE".

utf8_general_ci ne prend pas en charge les extensions/ligatures, il trie toutes ces lettres en caractères uniques, et parfois dans un mauvais ordre.

  1. utf8_unicode_ci est en général plus précis pour tous les scripts. Par exemple, sur bloc cyrillique: utf8_unicode_ci convient à toutes ces langues: russe, bulgare, biélorusse, macédonien, serbe et ukrainien. Alors que utf8_general_ci ne convient que pour le sous-ensemble russe et bulgare de cyrillique. Les lettres supplémentaires utilisées en biélorusse, macédonien, serbe et ukrainien ne sont pas triées correctement.

Le coût de utf8_unicode_ci est que c'est un peu bit plus lent que utf8_general_ci. Mais c'est le prix à payer pour l'exactitude. Soit vous pouvez avoir une réponse rapide qui est fausse, soit une réponse très légèrement plus lente qui est juste. Votre choix. Il est très difficile de justifier des réponses erronées. Il vaut donc mieux supposer que utf8_general_ci n'existe pas et de toujours utiliser utf8_unicode_ci. Eh bien, sauf si vous voulez de mauvaises réponses.

Source: http://forums.mysql.com/read.php?103,187048,188748#msg-188748

129
Timotei

De Jeux de caractères Unicode dans le documentation MySQL :

Pour tout jeu de caractères Unicode, les opérations effectuées à l'aide de _general_ci le classement est plus rapide que celui du _unicode_ci collation. Par exemple, des comparaisons pour le utf8_general_ci le classement est plus rapide, mais légèrement moins correct, que les comparaisons pour utf8_unicode_ci. La raison en est que utf8_unicode_ci prend en charge les mappages tels que les extensions; c'est-à-dire lorsqu'un caractère se compare comme étant égal à des combinaisons d'autres caractères. Par exemple, en allemand et dans d'autres langues "ß "Est égal à" ss ". utf8_unicode_ci prend également en charge les contractions et les caractères ignorables. utf8_general_ci est un classement hérité qui ne prend pas en charge les extensions, les contractions ou les caractères ignorables. Il ne peut faire que des comparaisons un à un entre les caractères.

20
Gumbo