J'essaie de comprendre quel classement je devrais utiliser pour différents types de données. 100% du contenu que je vais stocker est soumis par l'utilisateur.
Ma compréhension est que je devrais utiliser UTF-8 General CI (insensible à la casse) au lieu de UTF-8 Binary. Cependant, je ne trouve pas de distinction claire entre UTF-8 General CI et UTF-8 Unicode CI.
- Dois-je stocker du contenu soumis par l'utilisateur dans des colonnes CI UTF-8 Général ou UTF-8 Unicode?
- À quel type de données le binaire UTF-8 serait-il applicable?
utf8
, utilisezutf8mb4
plutôt pour une prise en charge complète de l'UTF-8. Commenter ici parce que les réponses à cette question populaire ne répondent pas à cela. mathiasbynens.be/notes/mysql-utf8mb4Réponses:
En général, utf8_general_ci est plus rapide que utf8_unicode_ci , mais moins correct.
Voici la différence:
Cité de: http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html
Pour une explication plus détaillée, veuillez lire l'article suivant sur les forums MySQL: http://forums.mysql.com/read.php?103,187048,188748
Quant à utf8_bin: utf8_general_ci et utf8_unicode_ci effectuent tous deux une comparaison insensible à la casse. En contraste , utf8_bin est sensible à la casse (entre autres différences), car il compare les valeurs binaires des caractères.
la source
show collation;
vous permet de voir le classement par défaut pour chaque jeu de caractères. 5.1 s'afficheutf8_general_ci
par défaut pourutf8
.Vous devez également être conscient du fait qu'avec utf8_general_ci lorsque vous utilisez un champ varchar comme index unique ou primaire, l'insertion de 2 valeurs comme 'a' et 'á' donnerait une erreur de clé en double.
la source
utf8_unicode_ci
utf8_bin
compare les bits à l'aveugle. Pas de pliage de boîtier, pas de décapage d'accent.utf8_general_ci
compare un octet à un octet. Il inclut le pliage et la suppression d'accentuation, mais aucune comparaison à 2 caractères:ij
n'est pas égalij
dans ce classement.utf8_*_ci
est un ensemble de règles spécifiques à la langue, mais sinon commeunicode_ci
. Quelques cas particuliers:Ç
,Č
,ch
,ll
utf8_unicode_ci
suit un ancien standard Unicode pour les comparaisons.ij
=ij
, maisae
! =æ
utf8_unicode_520_ci
suit une nouvelle norme Unicode.ae
=æ
Voir le tableau de classement pour plus de détails sur ce qui est égal à quoi dans divers classements utf8.
utf8
, tel que défini par MySQL, est limité aux codes utf8 de 1 à 3 octets. Cela laisse de côté Emoji et certains chinois. Vous devriez donc vraiment passer àutf8mb4
si vous voulez aller bien au-delà de l'Europe.Les points ci-dessus s'appliquent à
utf8mb4
, après un changement d'orthographe approprié. Aller de l'avant,utf8mb4
etutf8mb4_unicode_520_ci
sont préférés.la source
Vraiment, j'ai testé les valeurs de sauvegarde comme 'é' et 'e' dans la colonne avec un index unique et elles provoquent des erreurs en double sur 'utf8_unicode_ci' et 'utf8_general_ci'. Vous ne pouvez les enregistrer que dans la colonne assemblée «utf8_bin».
Et les documents mysql (dans http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html ) suggèrent dans ses exemples un ensemble de collations 'utf8_general_ci'.
la source
La réponse acceptée est obsolète.
Si vous utilisez MySQL 5.5.3+, utilisez
utf8mb4_unicode_ci
plutôt queutf8_unicode_ci
pour vous assurer que les caractères saisis par vos utilisateurs ne vous donneront pas d'erreurs.utf8mb4
prend en charge les emojis par exemple, alors qu'ilutf8
pourrait vous donner des centaines de bogues liés à l'encodage comme:Incorrect string value: ‘\xF0\x9F\x98\x81…’ for column ‘data’ at row 1
la source
utf8mb4_unicode_ci
traite (je pense) tous les Emoji comme égaux.utf8mb4_unicode_520_ci
donne un ordre à Emoji.