wake-up-neo.net

utf8mb4 in MySQL Workbench und JDBC

Ich habe mit einer UTF-8-codierten MySQL-Datenbank gearbeitet, die jetzt 4-Byte-Emojis speichern muss. Daher entschied ich mich, von utf8-Codierung zu utf8mb4 zu wechseln:

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;

Und mysql.conf.d "character-set-server = utf8" in "character-set-server = utf8mb4" geändert

Nach diesen Schritten kann ich Emojis (als ????) speichern, aber nur, wenn die SQL-Abfrage in der MySQL-Konsole ausgeführt wird: Wenn ich versuche, die Abfrage von MySQL Workbench oder von einer Wildfly-Webanwendung aus zu starten, bekomme ich es dieser Fehler:

Fehlercode: 1366. Falscher Stringwert: '\ xF0\x9F\x92\xA2' für Spalte 'SOURCE_CONTEXT' in Zeile 1

Ich gehe davon aus, dass ich die Verbindungsweise der Clients zur DB ändern muss, aber ich habe keine Ahnung, wie. Ich habe etwas über die Verwendung von "useUnicode = yes" in JDBC gelesen, funktioniert aber nicht.

$ {bdpath: 3306/bstdb? useUnicode = yes}

Bearbeiten : Wie in den Kommentaren vorgeschlagen, habe ich versucht mit:

$ {bdpath: 3306/bstdb? characterEncoding = UTF-8}

aber kein Glück, ich bekomme den gleichen Fehler "Falscher String-Wert: '\ xF0\x9F\x92\xA2'".

Auch versucht

$ {bdpath: 3306/bstdb? useUnicode = true & characterEncoding = utf8mb4 &}

aber es weigert sich, eine Verbindung herzustellen.

Irgendeine Idee, wie man MySQL-Workbench und/oder JDBC/Wildfly konfiguriert?

MySQL-Version ist 5.7.18 

MySQL WorkBench Version ist 6.0.8

Die JDBC-Treiberversion ist 5.1.34

Vielen Dank!

8
motagirl2

Endlich klappt es. Es war ein Problem mit gespeicherten Prozeduren, das nach der Migration immer noch utf8 anstelle von utf8mb4 war.

  1. Wie von @ mike-adamenko vorgeschlagen, legen Sie für my.cnf Folgendes fest 

[Klient] Standardzeichensatz = utf8mb4

[mysql] Standardzeichensatz = utf8mb4

[mysqld] Zeichensatz-Client-Handshake = FALSE Zeichensatz-Server = utf8mb4 collation-server = utf8mb4_unicode_ci

  1. In mysql ausführen:

    SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;

  2. Löschen Sie die betroffenen Prozeduren und erstellen Sie sie erneut. Sie befinden sich in utf8mb4 . Kann mit überprüft werden

SHOW PROCEDURE STATUS, wobei name LIKE 'procedure_name' ist;

6
motagirl2

Verwenden Sie characterEncoding=utf8 für die Jdbc-URL

jdbc:mysql://x.x.x.x:3306/db?useUnicode=true&characterEncoding=utf8

Überprüfen Sie auch, ob Sie MySQL für die Arbeit mit utf8mb4 konfiguriert haben.

    [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

Siehe hier

2
Mike Adamenko

Sie können der für MySQL verfügbaren Dokumentation folgen, um Ihr Problem zu beheben. Hier ist die MySQL-Dokumentation , auf die Sie sich beziehen können.

Grundsätzlich können Ihre ALTER TABLE-Skripts gemäß der oben genannten Dokumentation geändert werden. Anschließend können Sie den folgenden Parameter in Ihrer Verbindungszeichenfolge verwenden, damit die Änderungen wirksam werden.

jdbc:mysql://localhost/yourdatabasename?useUnicode=true&characterEncoding=UTF-8

Vergessen Sie nicht, Ihre MySQL-Dienste neu zu starten, nachdem Sie den Zeichensatz und die Kodierungsänderungen vorgenommen haben.

1
N00b Pr0grammer

Ab MySQL Connector/J 5.1.47 starten 

Wenn UTF-8 für characterEncoding in der Verbindungszeichenfolge verwendet wird, wird es dem MySQL-Zeichensatznamen utf8mb4 zugeordnet.

Sie können Dokumente hier überprüfen

0
Alaa Nassef