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

In MySQL können keine nicht-lateinischen Symbole eingefügt werden

In UTF-8 Упячка sollte eigentlich als \x423\x43F\x44F\x447\x43A\x430 dargestellt werden . Der \xD0\xA3\xD0\xBF\xD1\x8F... impliziert, dass sie falsch mit ISO-8859-1 kodiert wurden.

Hier ist ein Testausschnitt, der dies beweist:

String s = new String("Упячка".getBytes("UTF-8"), "ISO-8859-1"); // First decode with UTF-8, then (incorrectly) encode with ISO-8859-1.
for (char c : s.toCharArray()) {
    System.out.printf("\\x%X", (int) c);
}

Welche Drucke

\xD0\xA3\xD0\xBF\xD1\x8F\xD1\x87\xD0\xBA\xD0\xB0

Ihr Problem muss also einen Schritt vorher gelöst werden. Da Sie von einer Java-Webanwendung sprechen und diese Zeichenfolge wahrscheinlich aus Benutzereingaben resultiert, sind Sie sicher, dass Sie sich um die HTTP-Anforderungs- und -Antwortcodierungen gekümmert haben? Zuerst müssen Sie in JSP Folgendes am Anfang der JSP hinzufügen:

<%@ page pageEncoding="UTF-8" %>

Dadurch wird die Seite nicht nur in UTF-8 gerendert, sondern implizit auch ein HTTP Content-Type Response-Header, der den Client anweist, dass die Seite mit UTF-8 gerendert wird, sodass der Client weiß, dass er alle Inhalte anzeigen und alle Formulare mit derselben Codierung verarbeiten soll.

Nun, der Teil der HTTP-Anforderung, für GET-Anforderungen müssen Sie den betreffenden Servletcontainer konfigurieren. Bei Tomcat ist dies beispielsweise eine Frage der Einstellung des URIEncoding -Attribut des HTTP-Connector in /conf/server.xml entsprechend. Bei POST-Anforderungen sollte dies bereits durch den Client (Webbrowser) erledigt werden, der intelligent genug ist, um die in der JSP angegebene Antwortcodierung zu verwenden. Ist dies nicht der Fall, müssen Sie einen Filter einfügen was überprüft und Sätze die Anforderungscodierung.

Weitere Hintergrundinformationen finden Sie in diesem Artikel nützlich.

Abgesehen davon hat MySQL noch ein weiteres Problem mit Unicode-Zeichen. Es unterstützt nur UTF-8-Zeichen bis zu 3 Bytes , nicht 4 Byte. Mit anderen Worten, nur der BMP-Bereich von 65535 Zeichen wird unterstützt, außerhalb nicht. PostgreSQL zum Beispiel unterstützt es vollständig. Dies kann Ihrer Webanwendung nicht schaden, sollte aber unbedingt beachtet werden.