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!
Endlich klappt es. Es war ein Problem mit gespeicherten Prozeduren, das nach der Migration immer noch utf8 anstelle von utf8mb4 war.
[Klient] Standardzeichensatz = utf8mb4
[mysql] Standardzeichensatz = utf8mb4
[mysqld] Zeichensatz-Client-Handshake = FALSE Zeichensatz-Server = utf8mb4 collation-server = utf8mb4_unicode_ci
In mysql ausführen:
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
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;
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
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.
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