Einstellung des Zeichensatzes bei mysql-Abfragen
Nooooooooooooooooos
- datenbank
Hallo miteinander
Wenn ich Spalten abfrage, welche Umlaute enthalten, meldet mysql einen Fehler à la "Unknown column 'Durchführung_Abt' in 'field list'". Auch sonst werden Sonderzeichen aus der Datenbank in der Webseite falsch dargestellt.
In der Webseite verwende ich iso-8859-1/latin1. Die mysql Variablen mit phpMyAdmin abgefragt sehen so aus:
character set client utf8
(Globaler Wert) latin1
character set connection utf8
(Globaler Wert) latin1
character set database latin1
character set filesystem binary
character set server latin1
character set system utf8
character set results utf8
(Globaler Wert) latin1
Es fällt mir auf, dass 3mal utf8 statt dem globalen latin1 aktiv ist. Ich bin mir jetzt nur nicht sicher, ob dies nur in phpMyAdmin der Fall ist, vor allem, weil die Zeichen dort auch nicht korrekt angezeigt werden (was für mich aber nicht so schlimm ist). Was muss ich unternehmen, damit dann auch in phpMyAdmin die Ausgabe korrekt ist?
Viele Grüsse
Noooooooooooooos
Nach Konsulatation der MySql Referenz habe ich versucht die character_set_client und character_set_results auf latin1 zu stellen. Ich habe in phpMyAdmin "SET NAMES 'latin1';" und "SET character_set_client=latin1; SET character_set_results=latin1;" ausprobiert. Das hatte aber keine Wirkung, phpMyAdmin ist jeweils ohne Meldung zum Startbildschirm gesprungen und die Variablen hatten nach wie vor ihren alten Wert. Auch ein "mysql_query("SET NAMES 'latin1'");" in meiner php-Datei hat nichts bewirkt.
Meine Fragen sind nun: Was ist wirklich die Ursache meines Sonderzeichenproblems? Liegt es an den Einstellungen für die Zeichensätze in HTML/PHP/mysql/Apache? Warum lassen sich die Einstellungsvariablen von mysql nicht verändern?
Hi!
Wenn ich Spalten abfrage, welche Umlaute enthalten, meldet mysql einen Fehler à la "Unknown column 'Durchführung_Abt' in 'field list'". Auch sonst werden Sonderzeichen aus der Datenbank in der Webseite falsch dargestellt.
Siehe SELFHTML-Wiki Themen:Zeichencodierung/MySQL.
In der Webseite verwende ich iso-8859-1/latin1. Die mysql Variablen mit phpMyAdmin abgefragt sehen so aus:
character set client utf8
(Globaler Wert) latin1
[...]
Wenn du auf deiner eigenen Verbindung keine Aushandlung der zu verwendenden Zeichenkodierung vorgenommen hast, gilt der globale Wert. Die anderen Werte der Auflistung gelten für die Sitzung des phpMyAdmin, sind also für deine Sitzungen nicht relevant.
Es fällt mir auf, dass 3mal utf8 statt dem globalen latin1 aktiv ist. Ich bin mir jetzt nur nicht sicher, ob dies nur in phpMyAdmin der Fall ist, vor allem, weil die Zeichen dort auch nicht korrekt angezeigt werden (was für mich aber nicht so schlimm ist). Was muss ich unternehmen, damit dann auch in phpMyAdmin die Ausgabe korrekt ist?
Das sieht sehr danach aus, als ob jemand UTF-8-kodierte Daten übergeben hat, die Verbindungskodierung aber auf Latin1 eingestellt war. Damit konnte MySQL die Daten des SQL-Statements nicht richtig interpretieren und konnte die Daten nicht der Feldkodierung entsprechend ablegen (und gegebenenfalls dafür umkodieren, wenn die Feldkodierung nicht der Verbindungskodierung entspricht). Im Allgemeinen kann man davon ausgehen, dass der PMA alles richtig macht. Wenn er da was falsches anzeigt, dann sind die Daten fehlerhaft. Wenn du also für alle Systeme, die sich die Verbindungskodierung ordentlich aushandeln, richtige Ergebnisse sehen willst, musst du deinen Datenbestand korrigieren.
Nach Konsulatation der MySql Referenz habe ich versucht die character_set_client und character_set_results auf latin1 zu stellen. Ich habe in phpMyAdmin "SET NAMES 'latin1';" und "SET character_set_client=latin1; SET character_set_results=latin1;" ausprobiert. Das hatte aber keine Wirkung, phpMyAdmin ist jeweils ohne Meldung zum Startbildschirm gesprungen und die Variablen hatten nach wie vor ihren alten Wert.
Das sind sessionindividuelle Werte, die mit dem Session-Ende auch keine weitere Existenzberechtigung haben. Sie mit dem PMA abzusetzen hat keinen Sinn, weil ihre Auswirkungen gleich wieder entschwinden.
Auch ein "mysql_query("SET NAMES 'latin1'");" in meiner php-Datei hat nichts bewirkt.
Das tut nur dann das Richtige, wenn du korrekt kodierte Daten im DBMS hast beziehungswiese solche hinschickt.
Meine Fragen sind nun: Was ist wirklich die Ursache meines Sonderzeichenproblems? Liegt es an den Einstellungen für die Zeichensätze in HTML/PHP/mysql/Apache? Warum lassen sich die Einstellungsvariablen von mysql nicht verändern?
Diese Fragen lass ich mal unbeantwortet, weil sie hoffentlich im verlinkten Artikel zu finden sind oder durch meine obigen Ausführungen schon geklärt wurden. Wenn nicht, frag einfach noch mal, beziehungsweise das was jetzt noch unklar ist.
Lo!
Danke für deine umfangreiche Antwort. Dann sollte ja eigentlich mit der Verbindung zwischen meiner Webseite und der Datenbank alles OK sein.
Dann bleiben noch Fehlermöglichkeiten mit dem Datenbestand. Wenn ich direkt die Dateien der Tabellen ansehe, finde ich die Sonderzeichen korrekt dargestellt, wenn ich den Editor auf Latin1 einstelle. Das sollte ja eigentlich passen, denn character_set_server ist ja auch auf latin1 gesetzt. Doch character_set_system macht mir Sorgen. Wenn ich das Wiki richtig verstehe besagt diese Variable, dass einzig und allein die Bezeichner in utf8 kodiert sein müssen. Das würde dann heissen, dass ich nun alle Bezeichner nach utf8 umkodieren muss, während ich die Tabellen-Dateien in Latin1 belasse. Oder?
Eine andere Möglichkeit wäre, die Dateien vollständig nach utf8 zu konvertieren und character_set_server auf utf8 umzustellen. Oder? Doch wie kann ich character_set_server verändern. Eine SET-Anweisung in phpMyAdmin brachte kein Resultat: Er springt wieder ohne etwas zu melden zum Startbildschirm.
Viele Grüsse
Nooooooooooooooooos
Hi!
Wenn ich direkt die Dateien der Tabellen ansehe, finde ich die Sonderzeichen korrekt dargestellt, wenn ich den Editor auf Latin1 einstelle. Das sollte ja eigentlich passen, denn character_set_server ist ja auch auf latin1 gesetzt. Doch character_set_system macht mir Sorgen.
Wenn du die Bedeutung dieser Konfigurationseinstellungen ausführlicher kennenlernen möchtest, nimm dir das Kapitel Character Set Support vor. Ansonsten ist für den Anwender nur die Kodierung der Felder auf der einen Seite und die der Verbindung auf der anderen Seite wichtig. Alles andere sind mehr oder weniger Default-Werte, wenn man keine konkreten Angaben macht. Das sollte man aber tun, wenn man keinen Datenverlust haben möchte.
Wenn ich das Wiki richtig verstehe besagt diese Variable, dass einzig und allein die Bezeichner in utf8 kodiert sein müssen. Das würde dann heissen, dass ich nun alle Bezeichner nach utf8 umkodieren muss, während ich die Tabellen-Dateien in Latin1 belasse. Oder?
Nein, denn der gibt nur an, wie die Bezeichner gespeichert werden, und betrifft nicht ihre Notation in SQL-Statements. SQL-Statements müssen gemäß dem ausgehandelten (oder auf default gelassenen) Wert für character_set_client kodiert sein. - Das interessiert (bei Latin1- oder UTF-8-Verwendern) aber nur für Bezeichner, die aus Nicht-ASCII-Zeichen bestehen.
Eine andere Möglichkeit wäre, die Dateien vollständig nach utf8 zu konvertieren und character_set_server auf utf8 umzustellen. Oder?
Als Anwender sollte man nur die in der Kurzanleitung im Wiki erwähnten Dinge beachten: Feldkodierung und Verbindungskodierung explizit einstellen. Anstelle der Feldkodierung kann man auch die übergeordneten Default-Werte der Tabellen- und Datenbank-Kodierung konfigurieren, aber, wie gesagt, letzten Endes gibt die Feldkodierung an, welche Kodierung zum Speichern verwendet wird.
Doch wie kann ich character_set_server verändern. Eine SET-Anweisung in phpMyAdmin brachte kein Resultat: Er springt wieder ohne etwas zu melden zum Startbildschirm.
Wenn du character_set_server als Anwender änderst, dann geht dieser Wert am Sessionende wieder verloren. Im PMA nützt eine solche Einstellung lediglich dann etwas, wenn du im selben SQL-Fenster ein weiteres SQL-Statement ausführst, denn dann kann sie auf dieses wirken. Aber auch dann hast du mit dieser Direktive nicht alles erwischt, denn sie wird von den Individualeinstellungen übertrumpft.
Als Administrator kannst du zwar diese Einstellung serverglobal ändern, aber auch dann gelten die Überschreibregeln. Fazit: Lass diese Direktive so, wie sie der Administrator eingestellt hat und konzentrier dein Augenmerk auf die Feld- und Verbindungskodierungen.
Lo!
Ich muss viellecht noch klarstellen, dass der Server bei mir auf dem Computer läuft, ich also der Administrator bin und dass das Problem nur (noch) bei den Bezeichnern, den Spaltennamen, liegt. Deshalb führen dann Abfragen von bestimmten Spalten zu einem Fehler.
Ich bin mir jetzt recht sicher, dass das Problem bei der erzwungenen utf8-Kodierung für Bezeichner liegt. Ich habe die Datenbankdateien nämlich aus einem älteren Server kopiert, wo die Bezeichner noch mit latin1 kodiert sind. Diese These konnte ich dadurch bestätigen, dass ich eine manuelle Umkodierung eines einzigen Bezeichners durchführte und dieser nun korrekt erscheint (sowohl in phpMyAdmin als auch in meiner Webseite).
Ich fahre nun einfach so weiter, bis ich die ganze Datenbank korrigiert habe. Ich danke dir vielmals für deine geleistete Hilfe, ich hätte das Problem sonst nie beheben können.
Gruss
Noooooooooooooos