Quelle est la différence entre utf8 et utf8mb4 dans MySQL ?
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
utf8L’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
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éristique | utf8 | utf8mb4 |
|---|---|---|
| Max octets par caractère | 3 | 4 |
| Couverture Unicode | Jusqu’à 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 collation | Limitées | Plus é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 1Pire 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.


