Mysql
 sql >> Base de données >  >> RDS >> Mysql

Quelles sont les différences entre utf8_general_ci et utf8_unicode_ci ?

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.

  1. 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é.

  1. 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