Ich habe vor einiger Zeit JDBC gelernt und mich mit MySQL angeschlossen, um Daten zu erhalten. Nach den Beispieldaten des Lehrers musste ich einige Informationen wie Namen speichern, und sie waren alle auf Englisch. Ich wollte damals kein Englisch verwenden, also habe ich den Namen meines Mitbewohner gerettet. Hehe als Ergebnis ist etwas schief gelaufen.
Verbindung zur Datenbankanweisung herstellen:
statische endgültige Zeichenfolge db_url = "jdbc: mysql: // localhost/filemanagement";
Abfrageanweisung:
private statische endgültige Zeichenfolge thuserQuery = "Name, Kennwort, Rolle von userInfo Where name =?";
Ich benutze meinen Namen, um abzufragen. Warum ist das?
Die Antwort von Baidu ist der chinesische verstümmelte Code. Die Lösung besteht darin, die Anweisung für Verbindungsdatenbank an zu ändern:
statische endgültige Zeichenfolge db_url = "jdbc: mysql: // localhost/filemanagement?
Versuchen Sie es erneut!
Es ist in Ordnung! Aber warum ist das? Was sind diese beiden Parameter? Warum wurde das Problem nach dem Hinzufügen gelöst?
Diese beiden Parameter werden wie folgt erklärt:
Die Standardwerte für beide Parameter sind falsch. Mit anderen Worten, wenn wir den Zeichensatz angeben, der bei der Verbindung von MySQL für die Verbindung verwendet wird, ist alles normal. Aber ich weiß immer noch nicht viel über den Mechanismus, also überprüfe ich ihn weiter.
Es stellt sich heraus, dass es einen Charakter -Set -Konvertierungsprozess gibt, wenn die MySQL -Verbindung Abfrage und andere Vorgänge ausführt:
1. Wenn MySQL Server die Anforderung empfängt, konvertiert die Anforderungsdaten von charakter_set_client in charakter_set_connection;
2. Konvertieren Sie vor der Ausführung interner Vorgänge die angeforderten Daten von Charakter_Set_Connection in den internen Betriebszeichen. Die Bestimmungsmethode lautet wie folgt:
• Verwenden Sie den Wert für die Zeichensatzeinstellungswert für jedes Datenfeld.
• Wenn der obige Wert nicht vorhanden ist, verwenden Sie den Standard-Einstellwert (MySQL-Erweiterung, Nicht-SQL-Standard) der entsprechenden Datentabelle.
• Wenn der obige Wert nicht vorhanden ist, wird der Standardeinstellungswert der entsprechenden Datenbank verwendet.
• Wenn der obige Wert nicht vorhanden ist, verwenden Sie Zeichen_Set_Server, um den Wert festzulegen.
3.. Konvertieren Sie das Betriebsergebnis aus dem internen Betriebszeichen auf charakter_set_results.
Was repräsentieren diese Charaktersätze?
charakter_set_server: Standard -interner Betriebszeichensatz festgelegt
Zeichen_Set_Client: Der Zeichensatz, der von Client -Quelldaten verwendet wird
Zeichen_Set_Connection: Verbindungsschicht Zeichensatz
charakter_set_results: Abfrageergebniszeichen -Zeichensatz
Zeichen_Set_Database: Der Standardzeichensatz der aktuell ausgewählten Datenbank
Zeichen_Set_System: Systemmetadaten (Feldname usw.) Zeichensatz
Ich habe auch einige gemeinsame Fragen gefunden. Obwohl sie sich von meinem unterscheiden, sind sie von großem Referenzwert.
• Bevor Sie UTF8-kodierte Daten in eine Datentabelle mit dem Standardzeichen-Set IS UTF8 einfügen, ist der Verbindungszeichen UTF8.
Beim Einfügen gemäß den Standardeinstellungen des MySQL -Servers sind Zeichen_Set_Client, Zeichen_Set_Connection und Zeichen_Set_Results latein1;
Die Daten des Einfügungsvorgangs werden den Charakter -Set -Konvertierungsprozess von Latin1 => latein1 => UTF8 durchlaufen. Während dieses Prozesses wird jedes einfügte chinesische Zeichen aus den ursprünglichen 3 Bytes auf 6 Bytes gespeichert.
Das Ergebnis während der Abfrage wird den Charakter -Set -Konvertierungsprozess von UTF8 => UTF8 durchlaufen, und die gespeicherten 6 Bytes werden intakt zurückgegeben, was zu verstopften Code führt ...
• Legen Sie den Verbindungszeichen auf UTF8 ein, bevor Sie UTF8-kodierte Daten in eine Datentabelle mit dem Standardzeichen-Satz latein1 in eine Datentabelle einfügen1.
Beim Einfügen sind Charakter_Set_Client, Zeichen_Set_Connection und Zeichen_Set_Results alle UTF8;
Die Einfügungsdaten werden über den Zeichensatz von utf8 => utf8 => latein1 konvertiert. Wenn die Originaldaten andere Unicode -Zeichen als /u0000 ~ /u00ff enthält, wird sie in "?" (0x3f) Symbol, da es nicht im Zeichensatz von Latin1 dargestellt werden kann. In Zukunft kann der Inhalt in Zukunft nicht wiederhergestellt werden.
(Dieser Teil wird aus dem Blog von Brother Bird ausgehalten, und der Link ist später beigefügt)
Die Tabellen in meiner Datenbank sind alle mit UTF8 -Codierung festgelegt, aber als ich zum ersten Mal angeschlossen bin, habe ich den Verbindungszeichen nicht festgelegt, sodass der Standard -Latein1 ist. Nach der Konvertierung von UTF8 => Latin1 wird der verstümmelte Code generiert. Die GBK -Codierung, die ich zum zweiten Mal verwendet habe, und ich habe keine UTF8 -Codierung verwendet. Warum ist es in Ordnung? Eigentlich ist es dasselbe. Chinesisch ist nicht in lateinischer Codierung, sondern in GBK und UTF8, so dass es keine Probleme geben wird.
Die oben genannte Lösung für die verstümmelte Ausnahme der JDBC -Verbindung zu MySQL. Wenn Sie noch Fragen haben, können Sie diese im Kommentarbereich unten diskutieren.