web-dev-qa-db-fra.com

UTF-8: Général? Poubelle? Unicode?

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.

  1. Devrais-je stocker le contenu soumis par l'utilisateur dans les colonnes CI UTF-8 General ou UTF-8 Unicode?
  2. À quel type de données UTF-8 Binary serait-il applicable?
271
Dolph

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.

292
Sagi

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.

89
Alex Hepp
  • 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.

  • utf16 et utf32 sont des variantes de utf8; ils ne servent pratiquement à rien.
  • ucs2 est plus proche de "Unicode" que "utf8"; il ne sert pratiquement à rien.
27
Rick James

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
6
vitalii

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

3
Marwann