Quelle est la différence entre les jeux de caractères utf8mb4 et utf8 dans MySQL?

341

Quelle est la différence entre utf8mb4et utf8charsets dans MySQL ?

Je connais déjà les encodages ASCII , UTF-8 , UTF-16 et UTF-32 ; mais je suis curieux de savoir quelle est la différence de utf8mb4groupe d'encodages avec d'autres types d'encodage définis dans MySQL Server .

Y a-t-il des avantages / propositions spéciaux à utiliser utf8mb4plutôt que utf8?

Mojtaba Rezaeian
la source

Réponses:

392

UTF-8 est un codage de longueur variable. Dans le cas de l'UTF-8, cela signifie que le stockage d'un point de code nécessite un à quatre octets. Cependant, le codage de MySQL appelé "utf8" (alias de "utf8mb3") ne stocke qu'un maximum de trois octets par point de code.

Ainsi, le jeu de caractères "utf8" / "utf8mb3" ne peut pas stocker tous les points de code Unicode: il prend uniquement en charge la plage 0x000 à 0xFFFF, qui est appelée " Plan multilingue de base ". Voir aussi Comparaison des encodages Unicode .

C'est ce que (une version précédente de la même page) la documentation MySQL a à dire à ce sujet:

Le jeu de caractères nommé utf8 [/ utf8mb3] utilise au maximum trois octets par caractère et contient uniquement des caractères BMP. Depuis MySQL 5.5.3, le jeu de caractères utf8mb4 utilise un maximum de quatre octets par caractère et prend en charge les caractères supplémentaires:

  • Pour un caractère BMP, utf8 [/ utf8mb3] et utf8mb4 ont des caractéristiques de stockage identiques: mêmes valeurs de code, même encodage, même longueur.

  • Pour un caractère supplémentaire, utf8 [/ utf8mb3] ne peut pas du tout stocker le caractère , tandis que utf8mb4 nécessite quatre octets pour le stocker. Étant donné que utf8 [/ utf8mb3] ne peut pas du tout stocker le caractère, vous n'avez aucun caractère supplémentaire dans les colonnes utf8 [/ utf8mb3] et vous n'avez pas à vous soucier de convertir des caractères ou de perdre des données lors de la mise à niveau des données utf8 [/ utf8mb3] à partir d'anciennes versions de MySQL.

Donc, si vous souhaitez que votre colonne prenne en charge le stockage de caractères situés en dehors du BMP (et vous le souhaitez généralement), tels que les emoji , utilisez "utf8mb4". Voir aussi Quels sont les caractères Unicode non BMP les plus courants en utilisation réelle? .

CodeCaster
la source
10
Les seuls cas que j'ai rencontrés (jusqu'à présent) où utf8mb4 était «requis» sont le chinois et les émoticônes. Il y a des alphabets obscurs qui en ont besoin.
Rick James
10
Il est également requis si vous utilisez pour conserver les mots de passe et les données chiffrés dans votre base de données. Je gardais un mot de passe crypté dans mysql en utilisant le format utf8 normal, ce qui m'a causé beaucoup de problèmes avec certains mots de passe de manière aléatoire et très difficile à déboguer, donc finalement j'ai essayé d'utiliser le codage base64 et j'ai résolu le problème temporairement. Mais maintenant, je connais la raison.
Mojtaba Rezaeian
38
Les données chiffrées @idealidea sont binaires et vous ne devez pas stocker de données binaires dans une colonne varchar. :)
CodeCaster
8
@thomasrutter Essayez ce caractère (𡞰) pour enregistrer avec UTF-8. :)
502_Geek
2
@MojtabaRezaeian cela dépend quelque peu de l'algorithme de mot de passe - bcrypt2 produira ASCII.
Jasen
60

Le utf8mb4jeu de caractères est utile car de nos jours nous avons besoin de support pour stocker non seulement les caractères de langue mais aussi les symboles, les emojis nouvellement introduits, etc.

Une bonne lecture sur la façon de prendre en charge Unicode complet dans les bases de données MySQL par Mathias Bynens peut également apporter un éclairage à ce sujet.

Jimmy Kane
la source
11
MySQL 8.0 est désormais par défaut le jeu de caractères utf8mb4. [ mysql.com/products/enterprise/techspec.html]
Ahmed Rezk
47

Tiré du manuel de référence MySQL 8.0 :

  • utf8mb4: Un codage UTF-8 du jeu de caractères Unicode utilisant un à quatre octets par caractère.

  • utf8mb3: Un codage UTF-8 du jeu de caractères Unicode utilisant un à trois octets par caractère.

Dans MySQL utf8 est actuellement un alias utf8mb3qui est obsolète et sera supprimé dans une prochaine version de MySQL . À ce stade utf8 deviendra une référence à utf8mb4 .

Donc, quel que soit cet alias, vous pouvez vous définir consciemment un utf8mb4encodage.

Pour compléter la réponse, je voudrais ajouter le commentaire de @ WilliamEntriken ci-dessous (également tiré du manuel):

Pour éviter toute ambiguïté sur la signification de utf8, envisagez de spécifier utf8mb4explicitement les références au jeu de caractères au lieu de utf8.

simhumileco
la source