Quelle est la différence entre utf8 et utf8mb4 dans MySQL ?

L’encodage des caractères est fondamental pour la manière dont les données sont stockées, interrogées et rendues dans les applications modernes et les environnements d’hébergement. Si vous exécutez un site Web ou une application Web sur un hébergement partagé, un VPS ou un serveur dédié alimenté par MySQL ou MariaDB, vous avez probablement rencontré les termes utf8 et utf8mb4. À première vue, ils semblent synonymes : les deux représentent des encodages Unicode. Mais sous le capot, il existe une distinction critique qui peut déterminer la capacité de votre application à stocker des données textuelles modernes comme des emojis, du contenu multilingue ou certains caractères CJK (chinois, japonais, coréen) – surtout dans des solutions d’hébergement internationalisées ou multilingues.

Définitions

utf8

  • L’encodage Unicode hérité de MySQL.

  • Prend en charge uniquement 3 octets par caractère.

  • Capable de stocker des caractères dans le Plan Multilingue de Base (BMP) : U+0000 à U+FFFF.

  • Ne peut pas stocker d’emojis, de symboles musicaux, certains caractères chinois et d’autres caractères supplémentaires.

utf8mb4 (Multi-Octet 4)

  • La vraie implémentation UTF-8.

  • Prend en charge l’Unicode complet, y compris les caractères en dehors du BMP.

  • Utilise jusqu’à 4 octets par caractère – comme l’UTF-8 a été conçu pour le faire.

  • Nécessaire pour stocker des emojis (😊), des caractères chinois rares (𠀋) ou des symboles mathématiques (𝛑).

L’utf8 trompeur dans MySQL

Dans MySQL, le jeu de caractères utf8 est pas une implémentation complète de la norme UTF-8. Il est limité à 3 octets, tandis que l’UTF-8 standard utilise jusqu’à 4 octets. Cela signifie :

  • utf8 dans MySQL n’est pas un vrai UTF-8.

  • C’est plus comme un sous-ensemble de l’UTF-8 qui exclut les points de code au-delà de U+FFFF.

En revanche, utf8mb4 est entièrement conforme à la norme UTF-8.

Comparaison technique

Caractéristiqueutf8utf8mb4
Max octets par caractère34
Couverture UnicodeJusqu’à U+FFFF (BMP seulement)Plage complète (jusqu’à U+10FFFF)
Support des emojis❌ Non✅ Oui
Support des caractères supplémentaires❌ Non✅ Oui
Compatibilité MySQL✅ Sécurisé pour l’héritage✅ Unicode complet
Options de collationLimitéesPlus étendues (par exemple, utf8mb4_0900_ai_ci)

Pourquoi utf8mb4 est le bon choix

1. Support des emojis et des symboles modernes

Vous ne pouvez pas stocker 🐱, 🧠, 🚀, ou 🇩🇪 en utilisant utf8 de MySQL. Ceux-ci sont en dehors du BMP.

2. Meilleure collation et tri

utf8mb4 prend en charge des collations plus récentes comme :

  • utf8mb4_unicode_ci : Tri selon la norme Unicode

  • utf8mb4_general_ci : Rapide mais moins précis

  • utf8mb4_0900_ai_ci : Collation moderne consciente de l’Unicode 9.0 (disponible dans MySQL 8+)

3. Préparation pour l’avenir

À mesure que l’Unicode s’étend, de nouveaux caractères tomberont en dehors de la plage de 3 octets. utf8mb4 garantit que vous ne serez pas bloqué hors des futurs symboles.

Que se passe-t-il si vous utilisez utf8 ?

Si vous essayez d’insérer un caractère de 4 octets (comme un emoji) dans une colonne avec+, vous obtiendrez cette erreur :

ERROR 1366 (HY000): Incorrect string value: 'xF0x9Fx98x81' for column 'title' at row 1

Pire encore, votre application pourrait silencieusement tronquer ou corrompre des données si elle n’est pas correctement validée.

Migration de utf8 à utf8mb4

Pour migrer votre schéma en toute sécurité :

Étape 1 : Mettre à jour les définitions de table et de colonne

ALTER TABLE my_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Étape 2 : Mettre à jour les valeurs par défaut de la base de données

ALTER DATABASE my_db CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

Étape 3 : Mettre à jour les paramètres de connexion de l’application

Assurez-vous que votre application se connecte en utilisant utf8mb4 :

SET NAMES utf8mb4;

Meilleures pratiques

  • Utilisez toujours utf8mb4 pour les nouvelles bases de données.

  • ✅ Utilisez utf8mb4_unicode_ci pour la précision ou utf8mb4_general_ci pour la performance.

  • ✅ Définissez le jeu de caractères par défaut au niveau de la table et de la base de données.

  • ✅ Assurez-vous que les bibliothèques de couche d’application (par exemple, PDO, MySQLi, Sequelize) prennent en charge utf8mb4.

Conclusion

La différence entre utf8 et utf8mb4 dans MySQL est plus qu’un simple octet : c’est la différence entre la compatibilité Unicode moderne et l’échec silencieux. Bien que utf8 reste rétrocompatible, il est obsolète pour de nombreux cas d’utilisation modernes. Préférez toujours utf8mb4 pour préparer votre application à l’avenir et garantir un support complet des langues, des emojis et des symboles spéciaux.