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