Je travaillais avec une base de données MySQL codée en UTF-8 qui doit maintenant pouvoir stocker des emojis sur 4 octets. J'ai donc décidé de passer du codage utf8 à utf8mb4:
ALTER DATABASE bstdb CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE HISTORY CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE HISTORY CHANGE SOURCE_CONTEXT SOURCE_CONTEXT VARCHAR(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
Et changé mysql.conf.d "character-set-server = utf8" en "character-set-server = utf8mb4"
Après ces étapes, je suis en mesure de stocker des emojis (comme ????), mais uniquement lorsque la requête SQL est exécutée dans la console MySQL: Lorsque je tente de lancer la requête depuis MySQL Workbench ou une application Web Wildfly, je reçois cette erreur:
Code d'erreur: 1366. Valeur de chaîne incorrecte: '\ xF0\x9F\x92\xA2' pour la colonne 'SOURCE_CONTEXT' à la ligne 1
Je suppose que je dois changer la façon dont les clients se connectent à la base de données, mais je ne sais pas comment. J'ai lu quelque chose sur l'utilisation de "useUnicode = yes" dans JDBC, mais cela ne fonctionne pas.
$ {bdpath: 3306/bstdb? useUnicode = yes}
Edit : Comme suggéré dans les commentaires, j’ai essayé avec:
$ {bdpath: 3306/bstdb? characterEncoding = UTF-8}
mais pas de chance, je reçois la même erreur "Valeur de chaîne incorrecte: '\ xF0\x9F\x92\xA2'".
Aussi essayé
$ {bdpath: 3306/bstdb? useUnicode = true & characterEncoding = utf8mb4 &}
mais il refuse d'établir une connexion.
Toute idée sur la façon de configurer MySQL Workbench et/ou JDBC/Wildfly?
La version de MySQL est 5.7.18
La version de MySQL WorkBench est 6.0.8
La version du pilote JDBC est 5.1.34
Merci!
Enfin ça marche. C'était un problème avec les procédures stockées, qui était toujours utf8 au lieu de utf8mb4 après la migration . C'était une solution en 2 étapes.
[client] default-character-set = utf8mb4
[mysql] default-character-set = utf8mb4
[mysqld] character-set-client-handshake = FALSE character-set-server = utf8mb4 classement-serveur = utf8mb4_unicode_ci
Exécuter dans mysql:
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
Supprimez les procédures impliquées et créez-les à nouveau. Ils seront dans utf8mb4 . Peut être vérifié avec
SHOW PROCEDURE STATUS où le nom LIKE 'nom_procédure';
Utilisez characterEncoding=utf8
pour l'URL jdbc
jdbc:mysql://x.x.x.x:3306/db?useUnicode=true&characterEncoding=utf8
Vérifiez également que vous avez configuré MySQL pour fonctionner avec utf8mb4
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
Voir ici
Vous pouvez suivre la documentation disponible pour MySQL pour résoudre votre problème. Voici la documentation MySQL , à laquelle vous pourriez vous référer.
En gros, vos scripts ALTER TABLE
peuvent être modifiés conformément à la documentation susmentionnée. Vous pouvez ensuite utiliser le paramètre suivant dans votre chaîne de connexion pour que les modifications prennent effet.
jdbc:mysql://localhost/yourdatabasename?useUnicode=true&characterEncoding=UTF-8
N'oubliez pas de redémarrer vos services MySQL après avoir modifié le jeu de caractères et l'encodage.
À partir de MySQL Connector/J 5.1.47,
Lorsque UTF-8 est utilisé pour characterEncoding dans la chaîne de connexion, il correspond au nom du jeu de caractères MySQL utf8mb4.
Vous pouvez vérifier docs ici