2016-05-06 13 views
2

Ich habe diese MySQL-Tabelle in der Produktion, die von Charset latin1_swedish_ci (alias latin1) ist."Falscher String-Wert:" MySQL-Problem beim Einfügen von UTF8-Text in eine Latin1-Spalte

Im Moment gibt es diesen eingehenden Inhalt (String: "\ ud55c \ ubc24 \ uc758") in einem UTF-8-Format, das in diese Spalte TEXT Feld Schlüsselwörter in der Tabelle mit dem Namen eingefügt werden muss.

Wenn ich versuche, die INSERT ausführen, bekomme ich diesen Fehler:

Incorrect string value: '\xED\x95\x9C\xEB\xB0\xA4...' for column 'keywords' at row 1 

ich alle Arten von Möglichkeiten, in meinem Java-Code versucht haben, zu versuchen, von UTF8 nach ISO-8859-1 wie diese unten zu konvertieren und ich bin immer noch den gleichen Fehler:

String convertedString = new String(originalString.getBytes("UTF-8"), "ISO-8859-1"); 

ich weiß, es gibt Lösungen auf Stackoverflow, der den Zeichensatz des MySQL-Tabelle zu UTF8 ändern erwähnt von latin1, und ich kann leider nicht tun, weil es sich um eine Live-Produktion MySQL-Master-Server und es war auch historisch für uns in Latein1.

Hat jemand irgendwelche Vorschläge, um diesen Fehler "Falscher String-Wert" zu beheben?

Dank IS

+0

Sie müssen die Codierung _in Java_ von usc2 zu utf8 ändern. "ISO-8859-1" ist nirgends in dem, was du zeigst, involviert. Du hast auf '한밤' gehofft, richtig? –

+0

Hallo Rick James, danke für die schnelle Antwort. Was meinst du damit, die Codierung von usc2 zu utf8 zu ändern? Entschuldigung, ich folge nicht. Und ja, ich würde gerne zu 한밤 kommen – user1805458

+0

Also gab es ein altes Python-Skript, das diesen Unicode-Text aus einer anderen MySQL-Datenbank (in utf-8) lesen und in diese latin1-MySQL-Datenbank schreiben würde, und dieser Text würde angezeigt Wenn ich herausfinden kann, wie ich die "\ ud55c \ ubc24 \ uc758" in "í • œë ° ¤ì~" in meinem Java Code umwandeln kann, dann bin ich gut – user1805458

Antwort

0

Was Sie versuchen, einfach zu tun, ist nicht möglich, es sei denn, die Zeichen in der UTF-8-Zeichenfolge zufällig auch Darstellungen in latin1 haben ... und latin1 ist ein winziges Zeichen Single-Byte set (weniger als 256 mögliche Zeichen, total), so dass die überwiegende Mehrheit der gültigen utf8-Zeichen keine entsprechende latin1-Darstellung hat.

Sie können kein Zeichen in der Spalte speichern, die der Zeichensatz der Spalte nicht unterstützt. Es geht nicht darum, von einem zum anderen zu "konvertieren".

Wenn Sie Unicode benötigen, benötigen Sie mindestens eine utf8-Spalte, und das Ändern der Tabelle ist die einzige Alternative. Der Versuch, etwas anderes zu tun, ist wie der Versuch, eine negative Zahl in einer vorzeichenlosen Ganzzahlspalte zu speichern. Nicht signierte Ints können nicht negativ sein - es handelt sich nicht um eine Konvertierung.

Dies gilt für alle RDBMS, die Zeichendatentypen unterstützen, und ist keine Einschränkung für MySQL.

+0

Hallo Michael, danke für Antworten. So gab es früher ein altes Python-Skript, das diesen Unicode-Text von einer anderen MySQL-Datenbank (in utf-8) lesen und in diese latin1-MySQL-Datenbank schreiben würde, und dieser Text würde als í • œë ° ¤ì~ angezeigt werden kann herausfinden, wie man die "\ ud55c \ ubc24 \ uc758" in "í • œë ° ¤ì~" in meinem Java-Code umwandelt, dann bin ich gut – user1805458

0

한밤 ist das Mojibake für 한밤 - dort wurde es irgendwann in latin1 umgewandelt. Aber \ud55c\ubc24 ist Unicode. In welchem ​​Modus befindet sich Python? Hast du das am Anfang?

# -*- coding: utf-8 -*- 

More Python checklist.

Mehr

utf8 ist bevorzugt; Euckr ist möglich. Aber ... Das Problem besteht nicht darin, den Zeichensatz auszuwählen, sondern in der gesamten Anwendung konsistent zu sein, um diesen Zeichensatz zu spezifizieren.

Verwenden Sie Python? Es ist mit Java getaggt?

Für Java/JDBC benötigen Sie ?useUnicode=yes&characterEncoding=UTF-8 im Aufruf getConnection().

Sie müssen diese:

  • Das Bytes in der Client benötigen ED959C utf8, wie hex sein. (Koreanische Zeichen sind alle 3 Bytes in utf8.)
  • Die Verbindung zwischen dem Client und dem Server muss utf8 sein. Das Ausführen von SET NAMES utf8 direkt nach dem Verbinden ist eine andere Möglichkeit, dies zu tun. Die Spalte/Tabelle muss CHARACTER SET utf8 sein.
  • Wenn Sie HTML verwenden, wird es <meta charset=UTF-8> benötigen.

Für Koreanisch, utf8mb4 ist so gut wie utf8. Überprüfen Sie diese 4 Punkte oben und "beweisen" Sie uns, dass Sie alle tun.

Für JSP- und Java-Servlets ist eine geringfügige Abweichung von advice erforderlich.

+0

Hi Rick, ja, ich sehe "# - * - coding: utf -8 - * - "an der Spitze der Python-Datei – user1805458

+0

Alles, was im Checklisten-Link nützlich ist? –

+0

Leider noch nicht, aber ich habe versucht, eine andere Konvertierung im Java-Code zu verwenden. Wenn ich mit "new String (keywords.getBytes (" UTF-8 ")," Cp1252 ") versuche, zu Cp1252 statt ISO-8859-1 zu konvertieren", bemerkte ich etwas Interessantes – user1805458