Das Abfragen der mysql-Datenbank mit SQLDeveloper liefert keine korrekten Werte

9

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?

    
Aellyn 13.12.2012, 12:01
quelle

4 Antworten

1

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):

  • character_set_client: gibt an, wie Daten beim Senden von Client zu Server codiert werden. Alles, was über die MySQL-API eine Verbindung herstellt, ist nicht ein Client (z. B. PHPs mysqli, die meisten C / C ++ - Wrapper-Bibliotheken)
  • character_set_database: gibt die Kodierung für Daten an, die in der Datenbank
  • gespeichert sind
  • character_set_filesystem: nicht wirklich sicher, aber ich glaube, wie Daten auf die Festplatte geschrieben werden?
  • character_set_results: die Codierung, die MySQL Abfrageergebnisse zurückgibt
  • character_set_server: Server-Standardsatz (nicht wirklich sichere Fälle, in denen dies verwendet wird)
  • character_set_system: nicht sicher in diesem Fall
  • character_sets_dir: , wo sich Ihre Sortierungs- / Codierungsdefinitionen befinden

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

    
tazer84 16.01.2013 15:38
quelle
0

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

Ссылка

    
Ajith Sasidharan 05.12.2012 10:17
quelle
0

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

    
Bingo 08.02.2013 09:07
quelle
0

Exportieren

Fügen Sie [?characterEncoding=utf8]

hinzu %Vor%

Importieren

    
Mitsuhiro Yamashita 01.09.2016 11:03
quelle