Ich habe eine MySQL-Datenbank mit einem Zeichensatz utf8
aller Tabellen.
Ich verwende SQLDeveloper, um auf die Datenbank mit dem neuesten JConnector JDBC-Treiber zuzugreifen und sie abzufragen.
Beim Ausführen einer einfachen Abfrage wie SELECT 'Варна';
entspricht SELECT 'Варна' from DUAL;
, die bulgarische Sprache enthält, gibt SQLDeveloper '?????'
zurück. Dies führt dazu, dass die Auswahl aus der Datenbank, in der ich die bulgarische Sprache verwendet habe, NULL
zurückgibt, weil ihre where
-Klauseln (die die bulgarische Sprache enthalten) nicht mit den uft8
bulgarischen Zeichen in der Datenbank übereinstimmen. (Wenn das Select überhaupt keine bulgarische Sprache verwendet, gibt SQLDeveloper vollständig korrekte Werte zurück und zeigt die als Ergebnis der Abfrage zurückgegebene bulgarische Sprache korrekt an.)
Die Preferences -> Environment -> Encoding
in SQLDeveloper wird derzeit auf UTF-8
gesetzt, aber ich habe praktisch jede zutreffende Kodierung ausprobiert, die dort aufgelistet ist und selbst die einfachste Abfrage SELECT 'Варна' from DUAL;
gibt immer noch nicht den korrekten Wert Варна
zurück.
Ich habe nachgesehen, wie ich die Variable NLS_LANG
gesetzt habe, weil ich dachte, dies könnte die Ursache sein, aber ohne Erfolg. (Vielleicht ist es schließlich der Schlüssel, aber ich kann es nicht richtig konfigurieren).
Edit: Um das Problem zu reproduzieren und zu visualisieren (da ich weiß, dass ich es schlecht erklärt habe), gehen Sie einfach in SQLDeveloper und verbinden Sie sich mit einer MySQL-Datenbank und führen Sie die Abfrage SELECT 'Варна' from DUAL;
.
Edit2: Erläuterungen.
Edit3: Wie der Kommentar von @tenhouse zeigt, scheint dies ein Fehler zu sein.
Edit4: Wie oben erwähnt, funktioniert die obige Abfrage SELECT 'Варна' from DUAL;
einwandfrei ohne irgendwelche Änderungen und / oder Einstellungen an MySQL Workbench.
Edit5: Bitte korrigieren Sie den Titel und / oder die Tags, wenn Sie glauben, dass etwas verbessert werden kann, da es immer noch keine Antwort auf das Problem gibt.
Edit6: Kann ich jetzt davon ausgehen, dass es sich wirklich um einen Bug handelt? Könnte jemand mir sagen, wo genau es gemeldet werden soll - ist es ein JConnector oder SQLDeveloper bezogener Fehler? Ich würde denken, dass ich es als ein SQLDeveloper Bug melden muss, aber ich würde lieber eine Bestätigung bekommen, bevor möglicherweise ihre Zeit verschwendet wird.
Edit7: Versucht, es noch weiter in meinen Hoffnungen auf eine Antwort zu klären.
Edit8: (Wichtig!) Meine aktuelle Datenbank befindet sich auf dem Linux-Server (Ubuntu 12.04, MySQL 5.5.28). Wenn ich jedoch MySQL auf einer neuen Windows-Maschine installiere und dort eine utf8
db erstelle, funktioniert die Abfrage über SQLDeveloper so, wie sie soll, SELECT 'Варна' from DUAL;
gibt tatsächlich Варна
zurück. Könnte jemand bitte dies bestätigen?
Also wusste ich das selbst nicht, bis ich dieses Problem vor ein paar Monaten hatte, aber MySQL bietet tatsächlich die Möglichkeit für verschiedene Codierungen für Clients, Datenbanken und Verbindungen. MySQL konvertiert (oder sortiert) die Anfragen / Antworten von / zu einem Client in verschiedene Codierungen, wie vom Client oder in seiner Konfigurationsdatei angegeben. Auch wenn die Datenbank stuff als utf8 speichert, wird der Latin1 als Ergebniscodierung angezeigt, wenn der Client auf latin1 gesetzt ist. Dies überprüfen Sie am einfachsten, indem Sie eine Verbindung zu MySQL starten und die folgende Abfrage ausführen:
%Vor%Sie sollten eine ganze Reihe von Kodierungen für verschiedene Verbindungen / Quellen sehen. Aus Ihrer Beschreibung stelle ich mir vor, dass die meisten von diesen nicht utf8 sein werden. Hier ist mysql's doc zu was jeder von diesen meinen. Sie können testen, ob dies tatsächlich das Problem ist, indem Sie eine SET NAMES 'utf8'; oder Zeichensatz utf8; (kann sich nicht erinnern, welche) und führen Sie Ihre Abfragen erneut auf sehen Sie, ob das das Problem behebt.
Eine Zusammenfassung dessen, was jeder dieser Leute macht (da die Docs einige Sachen hinterlassen):
Die meisten dieser Leute können angegeben werden, indem Sie Ihre my.cnf editieren und Ihre Voreinstellungen dort festhalten.
Ich bin mir nicht ganz sicher, wie JConnector funktioniert, aber ich stelle mir vor, dass es die C-API von MySQL verwendet. In diesem Fall müssen Sie irgendwo im Code wie folgt vorgehen. Vielleicht hat JConnector eine Möglichkeit für Sie, dies durchzusetzen. Ich bin mir nicht sicher, aber hier ist die Syntax für die MySQL-API:
%Vor%BEARBEITEN: Für MySQL 5.5
Sie können einen Befehl wie folgt versuchen: ALTER DATABASE CHARACTER SET WE8ISO8859P5;
Bitte starten Sie die DB nach dem Ändern des Zeichensatzes neu.
Weitere Informationen finden Sie unter diesem Link, wo erklärt wird, welche Codierung für verschiedene Sprachen erforderlich ist
nachdem Sie eine Verbindung mit einem mysql_connect hergestellt haben:
%Vor%Sie tun diese Abfrage:
%Vor%Nun wird dies die Kodierung für das, was zurückgegeben wird, was auf dem Server passiert - also alles hat die gleiche Kodierung.
In den folgenden Abfragen geben Sie diese zu verwendende Verbindung an
Exportieren
Fügen Sie [?characterEncoding=utf8]
Importieren
Tags und Links mysql encoding oracle-sqldeveloper