Double Possible:
Quelle est la différence entre utf8_general_ci et utf8_unicode_ciJ'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?
Réponses
Trop de publicités?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.
-
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.
-
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
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 comparaisonsutf8_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.