Utilisez le charset utf8mb4 et la collation utf8mb4_unicode_ci dans MySQL et changez‑les via phpMyAdmin ou les commandes ALTER, n’oubliez pas non plus SET NAMES pour la connexion.
Charset (tegnsæt) détermine quels caractères la base de données peut stocker, et le collation détermine comment les caractères sont comparés et triés. Un charset incorrect est la cause la plus fréquente pour que les lettres danoises (æ, ø, å) ou les emojis s'affichent sous forme de points d'interrogation ou de mojibake (par exemple æ au lieu de æ).
Utilisez utf8mb4 comme charset et utf8mb4_unicode_ci comme collation. utf8mb4 prend en charge tous les caractères Unicode, y compris les emojis.
Modifier le paramètre par défaut pour toute la base de données (ne concerne que les nouvelles tables) :
utf8mb4_unicode_ci dans le menu déroulant.Modifier une table existante (y compris toutes ses colonnes) :
Modifier le paramètre par défaut de la base de données :
ALTER DATABASE mindatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Modifier une table et toutes ses colonnes :
ALTER TABLE mintabel CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Dans phpMyAdmin, vous pouvez changer le charset colonne par colonne : choisissez la table, cliquez sur Structure, cliquez sur Modifier à côté de la colonne, et sélectionnez la nouvelle collation dans la définition de la colonne.
Générez automatiquement les commandes ALTER :
SELECT CONCAT('ALTER TABLE `', TABLE_NAME, '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;')
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'mindatabase' AND TABLE_TYPE = 'BASE TABLE';
Exécutez le résultat dans phpMyAdmin sous l’onglet SQL ou via la ligne de commande.
Le charset de la base de données et le charset de la connexion sont deux choses différentes. Même si vos tables sont correctement réglées sur utf8mb4, les caractères peuvent être corrompus en transit si la connexion entre l’application et MySQL utilise un autre charset.
SET NAMES utf8mb4 définit trois variables de session en même temps :
character_set_client — ce que le serveur attend de recevoir du clientcharacter_set_connection — ce que le serveur utilise en interne lors du traitement des requêtescharacter_set_results — ce que le serveur renvoie au clientSET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
Bonne pratique : utilisez l’option charset intégrée du pilote au lieu d’envoyer SET NAMES manuellement. Cela garantit que des fonctions comme mysqli_real_escape_string() et PDO::quote() utilisent le bon charset — sinon, dans de rares cas, vous pourriez ouvrir la porte à une injection SQL.
Article de la catégorie support: MySQL