Intermédiaire 8 min de lecture 25 janvier 2025

utf8mb4 MySQL : encodage, collations et erreurs fréquentes

Vous insérez un emoji et MySQL renvoie "Incorrect string value" ? Un tri alphabétique paraît étrange ? Le jeu de caractères et la collation sont souvent en cause. Voici comment comprendre, configurer et sécuriser l'usage de utf8mb4 dans MySQL, du schéma aux connexions PHP.

Qu'est-ce que utf8mb4 dans MySQL ?

utf8mb4 est le jeu de caractères UTF-8 complet de MySQL (jusqu'à 4 octets par caractère), indispensable pour stocker les emojis, symboles rares et tout caractère au-delà du plan multilingue de base.

Voici les notions clés à connaître pour bien configurer MySQL :

1 Jeux de caractères MySQL

Comprendre la différence entre utf8 (3 octets) et utf8mb4 (4 octets) :

latin1 (1 octet), utf8 (3 octets, incomplet), utf8mb4 (4 octets, complet)

2 Collations utf8mb4

Elles définissent tri et comparaisons (sensibilité aux accents/casse).

utf8mb4_general_ci, utf8mb4_unicode_ci, utf8mb4_0900_ai_ci (MySQL 8.0)

3 Stockage et indexation

utf8mb4 augmente la taille en octets et impacte les index :

InnoDB ancien format: 767 octets max par index
With DYNAMIC/COMPRESSED (5.7+): ~3072 octets
VARCHAR(191) conseillé pour clés (191*4=764)
ROW_FORMAT=DYNAMIC, innodb_file_per_table=ON

4 Cas techniques et pièges

Caractères et combinaisons à 4 octets qui cassent en utf8 (3 octets) :

Emojis (U+1F600...), drapeaux (paires de régionalisateurs)
Modificateurs d'emoji (teinte), sélecteurs de variation
Caractères historiques, musicaux, mathématiques
Chaînes normalisées vs décomposées (NFC/NFD)

Problèmes classiques

Emojis tronqués ou remplacés par ?

Table/colonne en utf8 (3 octets) ou connexion non configurée en utf8mb4.

Erreur "Incorrect string value"

Arrive lors de l’insertion de caractères 4 octets en schéma/connexion non utf8mb4.

Index trop longs

Passage en utf8mb4 quadruple la taille: besoin de VARCHAR(191) ou de ROW_FORMAT adapté.

Tri/Comparaisons incohérents

Collation inadaptée: accent/casse/ordre différent selon utf8mb4_general_ci vs unicode.

Exemple de problème courant :

# Insertion d'un emoji dans une table mal configurée
table = CHARSET=utf8
sql = INSERT INTO users(name) VALUES('Alice 😊')
ERROR 1366 (HY000): Incorrect string value # ❌ utf8 n'accepte pas les 4 octets

Symptômes qui doivent vous alerter

🚨 Signaux d'alarme

!
Des points d'interrogation s'affichent à la place des emojis
!
Erreur MySQL "Incorrect string value" lors d'un INSERT/UPDATE
!
Tri anormal de chaînes avec accents ou casse mélangée
!
Index trop longs après migration (erreurs sur clés uniques)
!
Connexion applicative non alignée (SET NAMES manquant, DSN incorrect)

Comment vérifier votre configuration utf8mb4

✨ Solution recommandée : Clean ASCII

Clean ASCII aide à repérer dans vos textes les caractères qui exigent utf8mb4 (emojis, symboles rares) et à éviter les erreurs avant import en base MySQL. Préparez vos données et visualisez les points sensibles.

✅ Détection des 4 octets

Emojis, drapeaux, caractères hors BMP repérés instantanément

📊 Analyse complète

Positions, points de code Unicode, recommandations d’import

🧹 Préparation

Normalisation Unicode et remplacement sécurisé si nécessaire

💾 Export propre

Fichier prêt pour insertion dans MySQL configuré en utf8mb4

Autres méthodes de vérification

Affichage dans l'éditeur

✓ Activez l’affichage Unicode étendu pour repérer les caractères hors BMP
✓ Utilisez un linter qui alerte sur les caractères nécessitant utf8mb4

En ligne de commande (Unix)

# Variables globales de jeu de caractères
mysql -e "SHOW VARIABLES LIKE 'character_set_%';"
# Collations globales
mysql -e "SHOW VARIABLES LIKE 'collation_%';"
# Vérifier base/table
mysql -e "SHOW CREATE DATABASE ma_base\G"
mysql -e "SHOW TABLE STATUS FROM ma_base LIKE 'ma_table'\G"
# Colonnes non utf8mb4
mysql -e "SELECT TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,CHARACTER_SET_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='ma_base' AND CHARACTER_SET_NAME<>'utf8mb4';"

En code

JavaScript

// mysql2 / node-mysql
const conn = await mysql.createConnection({ charset: 'utf8mb4' });
await conn.query("SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci");

Python

# PyMySQL / mysqlclient
conn = pymysql.connect(charset="utf8mb4", use_unicode=True)
cur.execute("SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci")

Excel / Google Sheets

=SI(UNICODE(MID(cellule;position;1))>55295;"Peut nécessiter utf8mb4";"OK")

Migrer et prévenir les erreurs

🚀 Préparer vos données avec Clean ASCII

Avant d’écrire des scripts de migration, utilisez Clean ASCII pour détecter les caractères 4 octets et normaliser les entrées destinées à votre schéma utf8mb4.

✓ Détection des emojis et symboles 4 octets
✓ Normalisation Unicode (NFC/NFKC)
✓ Export immédiat prêt pour MySQL

Méthodes techniques avancées

🔧 Normaliser

✓ ALTER DATABASE/TABLE/COLUMN en CHARACTER SET utf8mb4 et collation uniforme
✓ Assurez SET NAMES utf8mb4 sur toutes les connexions applicatives
✓ Choisissez une collation moderne (utf8mb4_0900_ai_ci sur MySQL 8.0)

🧹 Filtrer

✓ Validez côté app que les entrées contiennent uniquement des caractères Unicode valides
✓ Nettoyez/normalisez les textes importés avant INSERT pour éviter les surprises
✓ Remplacez ou rejetez les caractères illégaux selon vos règles métier

⚙️ Automatiser

✓ Scripts de migration idempotents (ALTER ... CONVERT TO CHARACTER SET utf8mb4)
✓ Tests d'intégration insérant des emojis pour valider la chaîne complète
✓ Vérification CI des schémas SQL afin d’éviter le retour à utf8 (3 octets)

Checklist rapide

Serveur MySQL 5.7+ (idéalement 8.0) configuré en utf8mb4 par défaut
Base, tables et colonnes en CHARACTER SET utf8mb4 et collation cohérente
Connexions applicatives (PDO, drivers) avec SET NAMES utf8mb4
Index adaptés (VARCHAR(191), ROW_FORMAT=DYNAMIC si besoin)
Tests d’insertion de caractères 4 octets (ex: 😊, 🏳️‍🌈)
Documentation interne sur jeux de caractères et collations

Conclusion

Passer à utf8mb4 dans MySQL sécurise le stockage de tous les caractères modernes, y compris les emojis. Bien paramétrer le schéma, la collation et les connexions évite la majorité des erreurs.

Uniformisez votre configuration, testez avec des caractères 4 octets et surveillez les index: vous éliminerez 80% des bugs d’encodage et de tri liés à MySQL.

Vérifiez vos textes avant insertion MySQL

Utilisez notre outil pour détecter les caractères nécessitant utf8mb4 et préparer vos données.

Analyser mes données