Mysql
 sql >> Datenbank >  >> RDS >> Mysql

java.sql.SQLException:Falscher Stringwert:'\xF0\x9F\x91\xBD\xF0\x9F...'

Was Sie haben, ist EXTRATERRESTRIAL ALIEN (U+1F47D) und BROKEN HEART (U+1F494) die nicht in der grundlegenden mehrsprachigen Ebene liegen. Sie können in Java nicht einmal als ein Zeichen dargestellt werden, "👽💔".length() == 4 . Sie sind definitiv keine Nullzeichen und man sieht Quadrate, wenn Sie keine Schriftarten verwenden, die sie unterstützen.

utf8 von MySQL unterstützt nur grundlegende mehrsprachige Ebenen, und Sie müssen utf8mb4 verwenden stattdessen :

Bei einem ergänzenden Zeichen kann utf8 das Zeichen überhaupt nicht speichern, während utf8mb4 vier Bytes zum Speichern benötigt. Da utf8 die Zeichen überhaupt nicht speichern kann, haben Sie keine zusätzlichen Zeichen in utf8-Spalten und müssen sich keine Gedanken über die Konvertierung von Zeichen oder den Verlust von Daten machen, wenn Sie utf8-Daten von älteren MySQL-Versionen aktualisieren.

Um diese Zeichen zu unterstützen, muss Ihr MySQL 5.5+ sein und Sie müssen utf8mb4 verwenden überall, überallhin, allerorts. Die Verbindungscodierung muss utf8mb4 sein , muss der Zeichensatz utf8mb4 sein und die Sammlung muss utf8mb4 sein . Für Java ist es immer noch nur "utf-8" , aber MySQL braucht eine Unterscheidung.

Ich weiß nicht, welchen Treiber Sie verwenden, aber eine treiberunabhängige Möglichkeit, den Verbindungszeichensatz festzulegen, besteht darin, die Abfrage zu senden:

SET NAMES 'utf8mb4'

Direkt nach dem Herstellen der Verbindung.

Siehe auch dies für Connector/J :

14.14:Wie kann ich 4-Byte-UTF8, utf8mb4 mit Connector/J verwenden?

Um 4-Byte-UTF8 mit Connector/J zu verwenden, konfigurieren Sie den MySQL-Server mit character_set_server=utf8mb4. Connector/J verwendet dann diese Einstellungsolange characterEncoding nicht hat im Verbindungsstring gesetzt . Dies entspricht der automatischen Erkennung des Zeichensatzes.

Passen Sie auch Ihre Spalten und Datenbank an:

var1 varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL

Auch hier muss Ihre MySQL-Version für die utf8mb4-Unterstützung relativ aktuell sein.