utf8_general_ci
est une collation très simple - et sur Unicode, très cassée - qui donne des résultats incorrects sur le texte Unicode général. Ce qu'il fait est :
- convertit en forme de normalisation Unicode D pour la décomposition canonique
- supprime tous les caractères combinés
- convertit en majuscules
Cela ne fonctionne pas correctement sur Unicode, car il ne comprend pas la casse Unicode. La casse Unicode seule est beaucoup plus compliquée que ce qu'une approche orientée ASCII peut gérer. Par exemple :
- La minuscule de "ẞ" est "ß", mais la majuscule de "ß" est "SS".
- Il y a deux sigmas grecs minuscules, mais un seul majuscule ; considérez "Σίσυφος".
- Les lettres comme "ø" ne se décomposent pas en un "o" suivi d'un signe diacritique, ce qui signifie qu'elles ne seront pas triées correctement.
Il existe bien d'autres subtilités.
utf8_unicode_ci
utilise l'algorithme de classement Unicode , prend en charge les extensions et les ligatures, par exemple :la lettre allemande ß (U+00DF LETTER SHARP S) est triée près de "ss"La lettre Œ (U+0152 LATIN CAPITAL LIGATURE OE) est triée près de "OE".
utf8_general_ci
ne prend pas en charge les extensions/ligatures, il trie toutes ces lettres comme des caractères uniques, et parfois dans un ordre erroné.
utf8_unicode_ci
est généralement plus précis pour tous les scripts.Par exemple, sur le 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 qu'au sous-ensemble russe et bulgare du cyrillique. Les lettres supplémentaires utilisées en biélorusse, macédonien, serbe et ukrainien ne sont pas bien triées.
Le coût de utf8_unicode_ci
c'est que c'est un peu bits inférieur à 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 correcte. Votre choix. Il est très difficile de justifier de donner de mauvaises réponses, il est donc préférable de supposer que utf8_general_ci
n'existe pas et de toujours utiliser utf8_unicode_ci
. Eh bien, à moins que vous ne vouliez de mauvaises réponses.
Source :http://forums.mysql.com/read .php?103,187048,188748#msg-188748