web-dev-qa-db-fra.com

utf8mb4 dans MySQL Workbench et JDBC

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!

8
motagirl2

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.

  1. Comme suggéré par @ mike-adamenko, définissez my.cnf comme suit: 

[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

  1. Exécuter dans mysql:

    SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;

  2. 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';

6
motagirl2

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

2
Mike Adamenko

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.

1
N00b Pr0grammer

À 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

0
Alaa Nassef