J'essaie de comprendre le classement que je devrais utiliser pour divers types de données. 100% du contenu que je vais stocker est soumis par l'utilisateur.
D'après ce que je comprends, je devrais utiliser UTF-8 General CI (Case Insensitive) au lieu de UTF-8 Binary. Cependant, je ne trouve pas de distinction claire entre le CI général UTF-8 et le CI Unicode UTF-8.
En général, utf8_general_ci est plus rapide que utf8_unicode_ci , mais moins correct.
Voici la différence:
Pour tout jeu de caractères Unicode, les opérations effectuées à l'aide du classement _general_ci sont plus rapides que celles du classement _unicode_ci . Par exemple, les comparaisons pour le classement utf8_general_ci sont plus rapides, mais légèrement moins correctes que les comparaisons pour utf8_unicode_ci. La raison en est que utf8_unicode_ci prend en charge les mappages tels que les extensions; c'est-à-dire lorsqu'un caractère se compare à des combinaisons d'autres caractères. Par exemple, en allemand et dans certaines autres langues, "ß" est égal à "ss". utf8_unicode_ci supporte également 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 ni les caractères ignorables. Il ne peut faire que des comparaisons individuelles entre les personnages.
Cité de: http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html
Pour une explication plus détaillée, veuillez lire le post suivant sur les forums MySQL: http://forums.mysql.com/read.php?103,187048,188748
En ce qui concerne utf8_bin: les deux utf8_general_ci et utf8_unicode_ci effectuent une comparaison sans distinction de casse. En revanche, utf8_bin est sensible à la casse (entre autres), car il compare les valeurs binaires des caractères.
Vous devez également savoir que, avec utf8_general_ci lors de l’utilisation d’un champ varchar comme index unique ou primaire, l’insertion de deux valeurs telles que 'a' et 'á' donnerait une erreur de clé dupliquée.
utf8_bin
compare les bits à l'aveuglette. Aucun cas de pliage, pas de décapage accent.utf8_general_ci
compare un octet à un octet. Il ne casse pas la casse et , mais pas de comparaisons à 2 caractères: ij
n'est pas égal à ij
dans ce classement.utf8_*_ci
est un ensemble de règles spécifiques à la langue, mais qui ressemble par ailleurs à unicode_ci
. Quelques cas particuliers: Ç
, Č
, ch
, ll
utf8_unicode_ci
suit un ancien standard Unicode pour les comparaisons. ij
= ij
, mais ae
! = æ
utf8_unicode_520_ci
suit un nouveau standard Unicode. ae
= æ
Voir tableau de classement pour plus de détails sur ce qui est égal à ce qui se trouve dans divers classements de utf8.
utf8
, tel que défini par MySQL est limité aux codes utf8 de 1 à 3 octets. Cela laisse de côté Emoji et quelques Chinois. Donc, vous devriez vraiment passer à utf8mb4
si vous voulez aller beaucoup au-delà de l'Europe.
Les points ci-dessus s'appliquent à utf8mb4
, après un changement d'orthographe approprié. À l'avenir, utf8mb4
et utf8mb4_unicode_520_ci
sont préférés.
Vraiment, j'ai testé l'enregistrement de valeurs telles que 'é' et 'e' dans une colonne avec un index unique et elles provoquaient une erreur de duplication à la fois sur 'utf8_unicode_ci' et 'utf8_general_ci '. Vous pouvez les enregistrer uniquement dans la colonne assemblée 'utf8_bin'.
Et mysql docs (in http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html ) suggère dans son ensemble d’exemples le classement 'utf8_general_ci'.
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
La réponse acceptée est obsolète.
Si vous utilisez MySQL 5.5.3+, utilisez utf8mb4_unicode_ci
au lieu de utf8_unicode_ci
pour vous assurer que les caractères tapés par vos utilisateurs ne vous donneront pas d'erreur.
utf8mb4
prend en charge emojis par exemple, alors que utf8
peut vous donner des centaines de bogues liés à l'encodage tels que:
Incorrect string value: ‘\xF0\x9F\x98\x81…’ for column ‘data’ at row 1