nzc wrote:Und genau darauf laufen die meisten Konfigänderungsvorschläge (siehe Codebox) im Internet hinaus: Überall UTF8 als Default setzen. Muss man das gar nicht bzw. ist das sogar schädlich in Bezug auf Kompatibilität?
Prinzipiell muss man das nicht, wenn man überall konsequent den richtigen Zeichensatz verwendet und angibt - wie im vorigen post schon kurz angerissen (was man allein der Sauberkeit zu Liebe tun sollte). Default Zeichensätze könnten vielleicht das eine oder andere vergessene meta Tag ersetzen, doch du machst dein Script mit diesen Einstellungen abhängig von einer ganz speziellen Konfiguration (was aus Kompatibilitätsansicht eher negativ ist, da die Portabilität darunter leidet). Ich bin da bisher besser mit der Devise gefahren "lieber ein zwei fehlinterpretierte Zeichensätze mehr, die man auf der Entwicklungsumgebung beheben kann, und dafür lauffähig unabhängig von der Konfiguration".
Negativ könnte das zudem auch im Hinblick auf die Lauffähigkeit von Fremdscripts sein, wenn diese nicht mit dem erzwungenen Default-Zeichensatz zusammenarbeiten können, was aber recht selten ist.
nzc wrote:Auf jeden Fall sinnvoll finde ich die Konfigänderungen bei MySQL. Da ist mir das voreingestellte latin1 mit schwedischer Kollation doch ein Dorn im Auge.
Die Kollation ist übrigens nur für die Sortierung relevant. Es macht also kaum einen unterschied, ob du die Schwedische Kollation nimmst oder die Deutsche. Sinn macht es aber statt latin1 hier eine UTF8 Kollation zu wählen, in der Regel utf8_general_ci oder utf8_unicode_ci. Da musst du dann nur entscheiden, auf welcher Ebene du den Default-Zeichensatz umstellst. Sowohl das DBMS an sich, als auch jede Datenbank für sich, jede Datenbanktabelle und sogar jedes Datenbanktabellen-Textfeld kann seine Standard-Kollation definiert bekommen. Ich würde die Kollation bei neuen Datenbanken von der Datenbankebene (über den "Operationen" Reiter) abwärts festlegen, nicht über irgendwelche Konfigurationsparameter pauschal für das ganze DBMS in der Konfigurationsdatei, aus dem oben genannten Grund. Diese wird dann automatisch bei Neuanlegen von Datenbanktabellen oder Textfeldern als erstes vorgeschlagen/genommen und taucht auch in den SQL-Anweisungen der Datenbankexport auf.
Bei existierenden Datenbanken wirst du nicht umhin kommen die Daten auf Datenfeldebene zu konvertieren.
nzc wrote:Interessant und hilfreich für den PHP-Coder finde ich die init_connect Anweisung. Dann muss man nicht für jede UTF8-Verbindung aus dem PHP heraus immer das entsprechende SENT NAMES absetzten.
Ich lasse die SET NAMES Anweisung immer von meinem Datenbankwrapper setzen. Auch hier gilt für mich wieder, lieber die Abhängigkeiten im Code zu haben statt in der Konfiguration.
nzc wrote:Mit dem skip-character-set-client-handshake wäre ich dagegen wohl eher vorsichtig in Bezug auf Kompatibilität.
Prinzipiell wäre ich mit allen Einstellungen vorsichtig und würde sie erst setzen, wenn es wirklich nötig ist, also wenn Probleme auftreten. Wie gesagt, wenn du auf Scriptebene alles sauber hällst wirst du kaum Probleme bekommen.
Kleines Beispiel warum man vorsichtig sein sollte: Nehmen wir an, du setzt wie von jemandem empfohlen im Apache "AddDefaultCharset UTF-8". Der Apache geht dann hin und sendet bei jeder Antwort im Header mit, dass das folgende Dokument mit UTF-8 kodiert ist. Im Fremdscript ist im HTML-head aber vielleicht ein meta Tag mit Zeichenkodierung iso-8859-1 gesetzt. Nun hat der Browser zwei sich widersprechende Informationen und muss sich entscheiden. Du hast als Administrator keine Kontrolle darüber für welchen Wert er sich entscheidet. Schlimmer noch, du hast keine Möglichkeit über meta Angaben Ausnahmen von dieser Regel zu setzen, das geht nurnoch über weitere Apache Konfigurationsparameter. Ende vom Lied: Die Datei ist vielleicht wirklich mit iso-8859-1 kodiert und schon hast du Umlauteprobleme.
Meine Empfehlung: Schreib dem Apache nicht vor, was er sagen soll.
Sowohl bei PHP als auch HTML hast du volle Kontrolle darüber, in welcher Kodierung dein Nutztext vorliegt. Man kann sich das logisch ganz leicht begreiflich machen: Überlege an welcher Stelle die Speicherung ins Spiel kommt. Das ist bei der Datenbank in der Datenbanktabelle/dem Datenbankfeld und in PHP/HTML in den Dateien. Das sind die Orte in denen die Abhängigkeit zur Zeichenkodierung existiert (und natürlich in der Kommination zwischen den Schichten). Kann der Apache als übergeordnete Einheit die Entscheidung pauschal für alle Dateitypen treffen? Logisch gesehen: nein. Was letztendlich beim User ankommt ist nur eine Folge aus deinen Entscheidungen die du davor getroffen hast. Die Abhängigkeit sollte immer dort gesetzt werden wo sie auch vorliegt.
nzc wrote:bis hin zum Zeichensatz der Persistenzschicht selbst.
Das Wort "Persistenzschicht" musst ich - hüstel - erst mal googlen
Du meinst den Zeichensatz des Dateisystems, richtig?
Entschuldige, ich hab schonwieder zu sehr meine Programmiererbrille auf
Eine Art Code logisch zu trennen ist das
dreistufige Schichtmodell, bei dem die Präsentationsschicht (z.B. statische HTML Dateien) von der Schicht mit der Anwendungslogik (.php Dateien die, die die Anfragen Bearbeiten, Daten aufbereiten, etc) und der Datenhaltungsschicht/Persistenzschicht (in der Regel ein Datenbankmodell oder Dateimodel) aufgeteilt wird. Was ich eigentlich veranschaulichen wollte ist, dass nichtnur die Schichten an sich gültige sich nicht widersperchende Zeichenkodierungen verwenden sollten (
Datenbanktabellenfelder,
header Angaben), sondern die Kommunikation zwischen diesen auch passende Zeichenkodierungen aushandeln sollten (
SET NAMES,
accept charset). Und wenn dann noch die Daten korrekt gespeichert sind (bei HTML-/PHP-Dateien auf die Editoreinstellung achten, bei Datenbanken Ex- und Imports auch prüfen) läuft das wunderbar.
Jetzt ist der Beitrag schon viel zu lang.
Kurz: Ich würde auf alle von dir genannten Konfigurationsparameter verzichten, bis du merkst dass es ohne nicht geht.
Lege den Fokus lieber auf die vorhandenen Nutzdaten, den Dateien und den Zeichensätzen der Datenbank.
mit freundlichen Grüßen,
Altrea
P.S.: Auf Kürzungen und Schreibfehlerprüfungen wurde verzichtet. Wer Fehler findet, darf sie behalten