So wird meine Verbindung hergestellt:
Connection conn = DriverManager.getConnection(url + dbName + "?useUnicode=true&characterEncoding=utf-8", userName, password);
Beim Versuch, einer Zeile eine Zeile hinzuzufügen, wird folgende Fehlermeldung angezeigt:
Incorrect string value: '\xF0\x90\x8D\x83\xF0\x90...' for column 'content' at row 1
Ich füge Tausende von Datensätzen ein und erhalte immer diesen Fehler, wenn der Text \ xF0 enthält (dh der falsche Zeichenfolgenwert beginnt immer mit \ xF0).
Die Sortierung der Spalte lautet utf8_general_ci.
Was könnte das Problem sein?
Antworten:
MySQL
utf8
erlaubt nur die Unicode-Zeichen, die in UTF-8 mit 3 Bytes dargestellt werden können. Hier haben Sie ein Zeichen, das 4 Bytes benötigt: \ xF0 \ x90 \ x8D \ x83 ( U + 10343 GOTHIC LETTER SAUIL ).Wenn Sie über MySQL 5.5 oder höher verfügen, können Sie die Spaltencodierung von
utf8
auf ändernutf8mb4
. Diese Codierung ermöglicht die Speicherung von Zeichen, die 4 Bytes in UTF-8 belegen.Sie können auch die Server - Eigenschaft müssen ,
character_set_server
umutf8mb4
in der MySQL - Konfigurationsdatei. Ansonsten scheint Connector / J standardmäßig 3-Byte-Unicode zu verwenden :quelle
character_encoding_server
ist kein gültiger MySQL-Konfigurationsvariablenname. Ich habe versucht , Satzcharacter_set_server
zuutf8mb4
statt, zusätzlich zu den einzelnen Spalten, aber es hat nichts ändern.Die darin enthaltenen Zeichenfolgen
\xF0
sind einfach Zeichen, die mit UTF-8 als mehrere Bytes codiert wurden .Obwohl Ihre Sortierung auf utf8_general_ci festgelegt ist, vermute ich, dass die Zeichenkodierung der Datenbank, Tabelle oder sogar Spalte unterschiedlich sein kann. Sie sind unabhängige Einstellungen . Versuchen:
Ersetzen Sie VARCHAR (255) durch einen beliebigen Datentyp.
quelle
file-encoding
Parameter UTF-8 aufzurufen , z. B.java -Dfile.encoding=UTF-8
oder fügen Sie einen geeigneten Schalter in Ihre Tomcat-Konfigurationsdatei (usw.) ein.Habe das gleiche Problem, um die Daten zu speichern,
utf8mb4
muss sichergestellt werden:character_set_client, character_set_connection, character_set_results
areutf8mb4
:character_set_client
undcharacter_set_connection
geben den Zeichensatz an, in dem Anweisungen vom Client gesendet werden.character_set_results
Gibt den Zeichensatz an, in dem der Server Abfrageergebnisse an den Client zurückgibt.Siehe Zeichensatzverbindung .
Die Tabellen- und Spaltencodierung lautet
utf8mb4
Für JDBC gibt es zwei Lösungen:
Lösung 1 (MySQL muss neu gestartet werden):
Ändern Sie
my.cnf
wie folgt und starten Sie MySQL neu:Dies kann sicher die Datenbank machen und
character_set_client, character_set_connection, character_set_results
sindutf8mb4
standardmäßig aktiviert .Starten Sie MySQL neu
Ändern Sie die Tabellen- und Spaltencodierung in
utf8mb4
STOP - Angabe
characterEncoding=UTF-8
undcharacterSetResults=UTF-8
im jdbc Anschluss, verursachen diese außer Kraft gesetzt werdencharacter_set_client
,character_set_connection
,character_set_results
zuutf8
Lösung zwei (MySQL muss nicht neu gestartet werden):
Ändern Sie die Tabellen- und Spaltencodierung in
utf8mb4
Angabe
characterEncoding=UTF-8
in dem jdbc Anschluss, Ursache der jdbc Anschluss nicht suport tututf8mb4
.Schreiben Sie Ihre SQL-Anweisung wie folgt (müssen Sie
allowMultiQueries=true
zum JDBC-Connector hinzufügen ):Dadurch wird sichergestellt, dass jede Verbindung zum Server
character_set_client,character_set_connection,character_set_results
bestehtutf8mb4
.Siehe auch Zeichensatzverbindung .
quelle
SELECT
Abfragen angewendet werden, da erset names utf8mb4; select ... from ...
niemals einen erzeugtResultSet
und stattdessen zu einemResultSet is from UPDATE. No Data.
Fehler führt.Ich wollte ein paar Beiträge kombinieren, um eine vollständige Antwort darauf zu erhalten, da es sich anscheinend um ein paar Schritte handelt.
/etc/mysql/my.cnf
oder/etc/mysql/mysql.conf.d/mysqld.cnf
Wieder von Ratschlägen vor allem hatten
characterEncoding=UTF-8
und haben jdbc VerbindungencharacterSetResults=UTF-8
von ihnen entferntMit diesem Set
-Dfile.encoding=UTF-8
schien es keinen Unterschied zu machen.Ich konnte immer noch keinen internationalen Text in db schreiben und bekam den gleichen Fehler wie oben
Verwenden Sie nun diese Anleitung zum Konvertieren eines vollständigen MySQL-Datenbank-Zeichensatzes und einer Kollatierung in utf-8
Aktualisieren Sie Ihre gesamte Datenbank, um sie zu verwenden
utf8mb4
Führen Sie diese Abfrage aus, die angibt, was angerufen werden muss
Kopieren Einfügen Ausgabe im Editor Ersetzen Sie alle | mit nichts Post zurück in MySQL, wenn mit korrekter Datenbank verbunden.
Das war alles was getan werden musste und alles scheint für mich zu funktionieren. Nicht das -
Dfile.encoding=UTF-8
ist nicht aktiviert und es scheint wie erwartet zu funktionierenE2A Haben Sie immer noch ein Problem? Ich bin auf jeden Fall in der Produktion, es stellt sich also heraus, dass Sie überprüfen müssen, was oben getan wurde, da es manchmal nicht funktioniert. Hier ist Grund und Fehler in diesem Szenario:
Sie können sehen, dass einige noch in Latein versuchen, den Datensatz manuell zu aktualisieren:
Lassen Sie es uns eingrenzen:
Kurz gesagt, ich musste die Größe dieses Felds reduzieren, damit das Update funktioniert.
Wenn ich jetzt renne:
Es funktioniert alles
quelle
ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;
seltsamerweise meinen , als ich dies das letzte Mal ausführte, war für alle Felder kein Zeichensatz mehr definiert. Das Passwort von oben wurde also zupassword
varchar (255) NOT NULL (nichts über Codierung). Dies bedeutet, dass der letzte Befehl einfach dazu geführt haben muss, dass MySQL nach der tatsächlichen Tabellendefinition gesucht hat, und da die Tabelle nun standardmäßig so war, dass die Felder sie nicht mehr benötigen - ich nehme an, sie blieben beim Zeichensatz, nur weil während des Dumps der gesamten Tabellenaktualisierungen es konnte es nicht aktualisieren und daher wurde es in diesem Zustand belassenIn meinem Fall habe ich alles oben versucht, nichts hat funktioniert. Ich bin mir ziemlich sicher, meine Datenbank sieht wie folgt aus.
Also schaue ich in jeder Tabelle nach dem Spaltenzeichensatz
Es stellt sich heraus, dass der Spaltenzeichensatz lateinisch ist. Deshalb kann ich kein Chinesisch in die Datenbank einfügen.
Das könnte dir helfen. :) :)
quelle
Ich hatte das gleiche Problem in meinem Rails-Projekt:
Lösung 1: Konvertieren Sie vor dem Speichern in db den String durch
Base64.encode64(subject)
und nach dem Abrufen von db use in base64Base64.decode64(subject)
Lösung 2:
Schritt 1: Ändern Sie den Zeichensatz (und die Sortierung) für die Betreffspalte um
Schritt 2: In database.yml verwenden
quelle
mach einfach
quelle
Angenommen, Sie verwenden phpmyadmin , um diesen Fehler zu beheben , gehen Sie folgendermaßen vor:
latin1_swedish_ci
(oder was auch immer es ist) inutf8_general_ci
quelle
Es ist hauptsächlich auf einige Unicode-Zeichen zurückzuführen. In meinem Fall war es das Rupienwährungssymbol.
Um dies schnell zu beheben, musste ich den Charakter erkennen, der diesen Fehler verursachte. Ich habe den gesamten Text in einen Texteditor wie vi eingefügt und das störende Zeichen durch einen Text ersetzt.
quelle
Ich hatte dieses Problem mit meiner PLAY Java-Anwendung. Dies ist meine Stapelverfolgung für diese Ausnahme:
Ich habe versucht, einen Datensatz mit io.Ebean zu speichern. Ich habe das Problem behoben, indem ich meine Datenbank mit der Kollatierung utf8mb4 neu erstellt und die Play Evolution angewendet habe, um alle Tabellen neu zu erstellen, sodass alle Tabellen mit der Kollatierung utf-8 neu erstellt werden sollten.
quelle
Wenn Sie die Änderung nur für ein Feld anwenden möchten, können Sie versuchen, das Feld zu serialisieren
quelle
Wenn Sie eine neue MySQL-Tabelle erstellen, können Sie den Zeichensatz aller Spalten bei der Erstellung angeben. Dadurch wurde das Problem für mich behoben.
Weitere Informationen finden Sie unter: https://dev.mysql.com/doc/refman/8.0/en/charset-column.html
quelle
Dies ist nicht die Empfehlungslösung. Aber es lohnt sich zu teilen. Seit meinem Projekt wird das DBMS von altem MySQL auf neuestes (8) aktualisiert. Aber ich kann die Tabellenstruktur nicht ändern, nur die DBMS-Konfiguration (MySQL). Die Lösung für MySQL Server.
Test auf Windows - mysql 8.0.15 auf mysql config - Suche
kommentiere es aus. Oder in meinem Fall einfach eingeben / hinzufügen
warum nicht empfohlene Lösung. denn wenn Sie latin1 verwenden (mein Fall) .. die Daten erfolgreich einfügen, aber nicht den Inhalt (MySQL nicht mit Fehler antworten !!). Zum Beispiel geben Sie solche Informationen ein
es sparen
okay .. für mein Problem .. ich kann das Feld in UTF8 ändern .. aber es gibt ein kleines Problem .. siehe oben Antwort über andere Lösung ist fehlgeschlagen, weil das Wort nicht eingefügt wird, weil mehr als 2 Bytes (cmiiw) enthalten .. dies Lösung machen Ihre Daten einfügen Box. Der vernünftige ist, Blob zu verwenden .. und Sie können meine Antwort überspringen.
Ein weiterer diesbezüglicher Test war .. Verwenden von utf8_encode für Ihren Code vor dem Speichern. Ich benutze auf latin1 und es war ein Erfolg (ich benutze nicht den SQL-Modus )! Gleiche Antwort wie oben mit base64_encode .
Mein Vorschlag, Ihre Tabellenanforderungen zu analysieren und zu versuchen, von einem anderen Format zu UTF8 zu wechseln
quelle
Meine Lösung besteht darin, den Spaltentyp von varchar (255) in blob zu ändern
quelle
Sie müssen utf8mb4 in Meta-HTML und auch auf Ihrem Server festlegen, die Tabelle ändern und die Sortierung auf utf8mb4 setzen
quelle
Hinweis: Auf AWS RDS benötigen Sie eine neue Parametergruppe für Ihre MySQL-Datenbank mit den Parametern (anstatt eine my.cnf zu bearbeiten).
Hinweis: character_set_system bleibt "utf8"
Diese SQL-Befehle funktionieren NICHT DAUERHAFT - nur in einer Sitzung:
quelle
Ich musste auch alle gespeicherten Prozeduren (und Funktionen) der Datenbank löschen und neu erstellen, damit sie innerhalb des neuen Zeichensatzes von utf8mb4 ausgeführt werden.
Lauf:
… Um zu sehen, welche Prozeduren nicht auf die neuen Werte Character_set_client, Collation_connection und Database Collation des Servers aktualisiert wurden.
quelle