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?
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:
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:
Il existe de nombreuses autres subtilités.
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.
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
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 leutf8_general_ci
le classement est plus rapide, mais légèrement moins correct, que les comparaisons pourutf8_unicode_ci
. La raison en est queutf8_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.