dedlfix: Verknüpfung möglich ?

Beitrag lesen

echo $begrüßung;

Das heißt also, dass ich, als chronischer utf-8-Verweigerer da als erstes Statement in PHP immer "SET NAMES latin1;" vorausschicken sollte, wenn ich eine Datenbank(server)verbindung hergestellt habe. Macht man das vor oder nach dem mysql_select_db() oder ist es egal? (Die Datenbanknamen haben bei mir keine Zeichen oberhalb 7-Bit).

Normalerweise empfiehlt es sich unmittelbar nach dem Connect ein mysql_query() mit SET NAMES abzusetzen. Wenn man etwas fortgeschrittener ist, nimmt man ja vielleicht eine Datenbank-Klasse, da kann man das gleich als einen der Connection-Parameter mitgeben und in die die Verbindung aufbauende Methode integrieren (ggf. abhängig von der MySQL-Server-Version (Test ob 4.1 oder größer vorliegt)).

Da du aber ein pingeliger Mensch bist, müsstest du korrekterweise auf SET NAMES und die alten mysql-Funktionen von PHP verzichten, denn ein SET NAMES wirkt sich zwar auf die über diese Verbindung transportierten Daten aus, nicht aber auf die MySQL-API-Funktion mysql_real_escape_string() und dessen PHP-Pendant. Da wäre der richtige Weg, die mysqli-Schnittstelle zu verwenden und mit mysqli_set_charset() die Verbindungskodierung zu setzen. (Wie ich gerade sehe, hat ab PHP 5.2.3 mittlerweile auch in der alten mysql-Funktionen-Welt eine Funktion namens mysql_set_charset() Einzug gehalten, die mysqli_set_charset() entspricht.)

Alle weniger pingeligen können weiterhin mysql_real_escape_string() und sogar auch mysql_escape_string() verwenden, denn die Bytewerte der von diesen Funktionen behandelten Zeichen sind für die im alten Europa üblichen Kodierungen ISO-8859-x und UTF-8 eineindeutig und die selben, da sie alle im Bereich 0x00 bis 0x7F liegen. Es gibt mindestens[*] eine in Asien verwendete Kodierung, bei der mindestens[*] ein Bytewert eines der fraglichen Zeichen in Bytesequenzen anderer Zeichen verwendet wird. Dann erzeugt mysql_(real_)escape_string() eine falsche Maskierung, und das trotz SET NAMES, wenn dieser Wert vom Server-Default-Wert abweicht.

[*] "mindestens", weil ich nach dem Finden eines Vorkommens nicht weitergesucht habe. Gemerkt habe ich mir den Namen der Kodierung auch nicht. Ich brauchte nur ein Opfer, an dem ich das Verhalten testen konnte. Und da es UTF-8 gibt, sind diese asiatischen Kodierungen für mich unter "historisch" abgelegt (obwohl sie dort immer noch Verwendung finden).

Für Otto-Normal-PHP-Programmierer ist das ganze Geschwafel weniger interessant. Wichtig ist im Prinzip nur,

  • die Tabellenfelder mit einer passenden Kodierung zu versehen,
  • nach dem Verbindungsaufbau mit SET NAMES eine Kodierung einzustellen,
  • und in Statements eingefügte Werte mit mysql_(real_)escape_string() zu bearbeiten.

[*] Alle Stellen zu finden lasse ich mal als Hausaufgabe (besonders für Tom) stehen :-)
Das habe ich befürchtet, habe es aber schon auf dem Zettel... :-)

Als Zusatzaufgabe wäre noch interessant, welche Default-Werte kommen an welchen der Stellen zum Einsatz, wenn keine explizite Angabe erfolgte. Wenn du das auch noch beantworten kannst, solltest du MySQLs Zeichenkodierungskonzept verstanden haben. :-)

echo "$verabschiedung $name";