91 votes

Quelles sont les diffrences entre utf8_general_ci et utf8_unicode_ci?

Double Possible:
Quelle est la différence entre utf8_general_ci et utf8_unicode_ci

J'ai deux options pour l'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 nous expliquer quelle est la différence entre utf8_general_ci et utf8_unicode_ci? Quels sont les effets du choix de l'une sur l'autre lors de la conception d'une base de données?

141voto

Timotei Points 984

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

  • convertit à la normalisation Unicode formulaire D pour la décomposition canonique
  • supprime toutes les combinaisons de caractères
  • convertit en majuscules

Cela ne fonctionne pas correctement sur Unicode, parce qu'il ne comprend pas Unicode boîtier. Unicode boîtier seul est beaucoup plus compliqué que de l'ASCII-esprit peut gérer. Par exemple:

  • Les minuscules de "ß" est "β", mais la majuscule de "β" est "SS".
  • Il y a deux minuscule grecque sigma, mais seulement une lettre majuscule; envisager de "Σίσυφος".
  • Les lettres "o" ne se décomposent pas à un "o" en plus d'une diacritiques, ce qui signifie qu'il ne sera pas trier correctement.

Il existe de nombreuses autres subtilités.

  1. utf8_unicode_ci utilise le standard Unicode Collation Algorithm, soutient donc appelé les expansions et les ligatures, par exemple: Allemand lettre ß (U+00DF LETTRE SHARP S) est triée près de "ss" Lettre Œ (U+0152 LATINE CAPITAL LIGATURE OE) est triée près "OE".

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

  1. utf8_unicode_ci est généralement plus précis pour tous les scripts. Par exemple, sur l'alphabet Cyrillique bloc: utf8_unicode_ci est très bien pour toutes ces langues: Le russe, le bulgare, Biélorusse, le macédonien, le serbe et l'ukrainien. Tout en utf8_general_ci est bien seulement pour le russe et le bulgare sous-ensemble de l'alphabet Cyrillique. Lettres supplémentaires utilisés dans le Biélorusse, le macédonien, le serbe, l'ukrainien et sont triées pas bien.

Le coût de l' utf8_unicode_ci , c'est qu'il est un petit peu plus lent que l' utf8_general_ci. Mais c'est le prix à payer pour l'exactitude. Vous pouvez soit avoir une réponse rapide, c'est faux, ou un très léger ralentissement de la réponse qui est la bonne. De votre choix. Il est très difficile de justifier de donner de mauvaises réponses, il est donc préférable de supposer qu' utf8_general_ci n'existe pas et de toujours utiliser utf8_unicode_ci. Eh bien, à moins que vous voulez de mauvaises réponses.

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

20voto

Gumbo Points 279147

De Jeux de Caractères Unicode dans la documentation de MySQL:

Pour n'importe quel jeu de caractères Unicode, les opérations effectuées à l'aide de l' _general_ci classement sont plus rapides que ceux de l' _unicode_ci classement. Par exemple, les comparaisons de l' utf8_general_ci classement sont le plus rapide, mais un peu moins correcte, que les comparaisons utf8_unicode_ci. La raison pour cela est qu' utf8_unicode_ci prend en charge les mappages, comme l'expansion; c'est, quand un personnage se compare comme l'égalité des combinaisons des autres personnages. Par exemple, en allemand et en quelques autres langues "ß" est identique à "ss". utf8_unicode_ci prend également en charge les contractions et ignorable caractères. utf8_general_ci est un héritage de classement ne prend pas en charge les expansions, les contractions, ou ignorable caractères. Il ne peut faire qu'une comparaison directe entre les personnages.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X