Ich habe den folgenden Zeichenfolgenwert: "walmart obama 👽💔"
Ich benutze MySQL und Java.
Ich erhalte die folgende Ausnahme: `java.sql.SQLException: Falscher Zeichenfolgenwert: '\ xF0 \ x9F \ x91 \ xBD \ xF0 \ x9F ...'
Hier ist die Variable, in die ich einfügen möchte:
var1 varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL`
Mein Java-Code, der versucht, "walmart obama 👽💔" einzufügen, ist eine vorbereitete Anweisung. Also benutze ich die setString()
Methode.
Es sieht so aus, als ob das Problem in der Codierung der Werte 👽💔 liegt. Wie kann ich das beheben? Zuvor habe ich Derby SQL verwendet und die Werte 👽💔 waren nur zwei Quadratmeter (ich denke, dies ist die Darstellung des Nullzeichens).
Jede Hilfe wird sehr geschätzt!
java
mysql
encoding
character-encoding
sqlexception
CodeKingPlusPlus
quelle
quelle
CREATE DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Antworten:
Was Sie haben, ist
EXTRATERRESTRIAL ALIEN (U+1F47D)
undBROKEN HEART (U+1F494)
was nicht in der mehrsprachigen Grundebene. Sie können nicht einmal in Java 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.MySQL unterstützt
utf8
nur die mehrsprachige Grundebene, und Sie müssenutf8mb4
stattdessen Folgendes verwenden :Um diese Zeichen zu unterstützen, muss MySQL 5.5+ sein und Sie müssen es
utf8mb4
überall verwenden. Die Verbindungscodierung muss seinutf8mb4
, der Zeichensatz muss seinutf8mb4
und die Kollision muss seinutf8mb4
. Für Java ist es immer noch gerecht"utf-8"
, aber MySQL braucht eine Unterscheidung.Ich weiß nicht, welchen Treiber Sie verwenden, aber eine treiberunabhängige Methode zum Festlegen des Verbindungszeichensatzes besteht darin, die folgende Abfrage zu senden:
Gleich nach dem Herstellen der Verbindung.
Siehe auch dies für Connector / J :
Passen Sie auch Ihre Spalten und Ihre Datenbank an:
Auch hier muss Ihre MySQL-Version für die Unterstützung von utf8mb4 relativ aktuell sein.
quelle
utf8mb4
, es sieht so aus, als ob Sie noch verwendenutf8_general_ci
..Do not issue the query set names with Connector/J, as the driver will not detect that the character set has changed, and will continue to use the character set detected during the initial connection setup.
Alles in allem müssen Sie zum Speichern von Symbolen, für die 4 Byte erforderlich sind, das Characher-Set und die Sortierung aktualisieren für
utf8mb4
:alter table <some_table> convert to character set utf8mb4 collate utf8mb4_unicode_ci
In meiner Entwicklungsumgebung für # 2 ziehe ich es vor, beim Starten des Servers Parameter in der Befehlszeile festzulegen:
mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
Achten Sie übrigens auf das Connector / J-Verhalten mit
SET NAMES 'utf8mb4'
:Vermeiden Sie es,
characterEncoding
Parameter in der Verbindungs-URL festzulegen, da dies die konfigurierte Servercodierung überschreibt:quelle
Seltsamerweise fand ich, dass das ENTFERNEN
&characterEncoding=UTF-8
von demJDBC url
bei ähnlichen Problemen den Trick für mich tat.Basierend auf meinen Eigenschaften,
Ich denke, dies unterstützt das, was @Esailija oben gesagt hat, dh mein MySQL, das in der Tat 5,5 ist, findet seine eigene Lieblingsvariante der UTF-8-Codierung heraus.
(Beachten Sie, dass ich auch das spezifiziere, von dem
InputStream
ich lese, wieUTF-8
im Java-Code, was wahrscheinlich nicht weh tut) ...quelle
useUnicode=true
wird es nicht einmal gebraucht? In meinem Fall hat es nur funktioniert,character_set_server=utf8mb4
global auf dem Server (RDS-Parametergruppe) festzulegen und KEINE Zeichencodierung in der JDBC-URL zu haben.Wie ich mein Problem gelöst habe.
ich hatte
In meiner jdbc-Verbindungs-URL im Ruhezustand habe ich den String-Datentyp in der Datenbank in Langtext geändert, was zuvor varchar war.
quelle
Hängen Sie die Zeile
useUnicode=true&characterEncoding=UTF-8
an Ihre JDBC-URL an.In Ihrem Fall werden die Daten nicht mit
UTF-8
Codierung gesendet.quelle
Ich vor dem gleichen Problem und löste es durch die Einstellung Sortierungs zu utf8_general_ci für jede Spalte.
quelle
Ich denke, MySQL glaubt nicht, dass dies gültiger UTF8-Text ist. Ich habe versucht, eine Einfügung in eine Testtabelle mit derselben Spaltendefinition durchzuführen (die MySQL-Client-Verbindung war ebenfalls UTF8), und obwohl die Einfügung durchgeführt wurde, haben die Daten, die ich mit dem MySQL CLI-Client sowie JDBC abgerufen habe, die Werte nicht korrekt abgerufen. Um sicherzugehen, dass UTF8 korrekt funktioniert hat, habe ich ein "ö" anstelle eines "o" für Obama eingefügt:
Kleine Java-Anwendung zum Testen mit:
Ausgabe:
Außerdem habe ich das gleiche Insert mit der JDBC-Verbindung versucht und es hat die gleiche Ausnahme ausgelöst, die Sie erhalten. Ich glaube, dass dies ein MySQL-Fehler ist. Vielleicht gibt es bereits einen Fehlerbericht über eine solche Situation.
quelle
Ich hatte das gleiche Problem und nachdem ich sorgfältig gegen alle Zeichensätze vorgegangen war und festgestellt hatte, dass sie in Ordnung waren, stellte ich fest, dass die fehlerhafte Eigenschaft, die ich in meiner Klasse hatte, als @Column anstelle von @JoinColumn (javax.presistence; Hibernate) und kommentiert wurde es zerbrach alles.
quelle
ausführen
Finde den Zeichensatz-Server, wenn er nicht utf8mb4 ist.
setze es in deine my.cnf, wie
füge eine Zeile hinzu
endlich mysql neu starten
quelle
character_set_server
ist die Option, NICHTcharacter-set-server
Diese Einstellung useOldUTF8Behavior = true hat bei mir gut funktioniert. Es gab keine falschen Zeichenfolgenfehler, aber es konvertierte Sonderzeichen wie à in mehrere Zeichen und speicherte sie in der Datenbank.
Um solche Situationen zu vermeiden, habe ich diese Eigenschaft aus dem JDBC-Parameter entfernt und stattdessen den Datentyp meiner Spalte in BLOB konvertiert. Das hat perfekt funktioniert.
quelle
Außerdem kann der Datentyp die Blob-Installation von Varchar oder Text verwenden.
quelle