dedlfix: UTF-Speicherung in MySQL

Beitrag lesen

echo $begrüßung;

PHP kennt ein Pendant zu dieser Funktion für die mysqli-Extension schon lange (mysqli_set_charset()), für die mysql-Extension erst seit 5.2.3 (mysql_set_charset())
Und für Pdo_MySQL anscheinend gar nicht… hört sich zumindest nach diesem Kommentar so an:
  pdo doesn't care about charsets. if you want to have your connection in unicode / utf-8
  or any other encoding, you'll have to tell your database, for example using
  $dbh->exec('SET CHARACTER SET utf8') (mysql).

SET CHARACTER SET arbeitet etwas anders als SET NAMES, wenn unterschiedliche Kodierungen für Verbindung und gespeicherten Daten verwendet werden. Im Allgemeinen möchte man aber nur eine einzige Kodierung im gesamten Prozess haben und sollte dann auch SET NAMES verwenden.

Da frage ich mich doch gerade, ob ich nicht statt PDO vielleicht lieber wieder mysqli verwenden sollte, wenn in dem meisten Fällen sowieso nur eine MySQL-Datenbank dahinter zum Einsatz kommt…

Auf ein anderes DBMS nur durch Ändern des Connection-String umsteigen zu können, ist meist nur eine Illusion. Man muss sich dann auch bei den verwendeten Statements und Datentypen auf das kleinste gemeinsame Vielfache aller DBMS einschränken, wobei einem jede Menge Leistungsmerkmale des gerade verwendeten DBMS verschlossen bleiben. Insofern halte ich den Einsatz einer Abstraktionsschicht aus diesem Grund für nicht weit genug gedacht.

In der Praxis passiert es gelegentlich, dass man für verschiedene Projekte unterschiedliche DBMS zu verwenden hat, und da ist es schon nicht schlecht, wenn man die einmal gelernte API-Bedienung weiterverwenden kann. Es bleiben noch genug Unterschiede in der SQL-Syntax zum lernen übrig. Außerdem bilden manche APIs auch noch Funktionalität nach, die es nativ nicht gibt. Ein Beispiel sind Prepared Statements, die es für die mysql-Extension PHPs nicht gibt.

PDO mit mysqli verglichen, fällt mir das umständlichere Prepared-Statements-Handling unter mysqli ein. Das ist unter PDO bedienerfreundlicher gelöst (auch wenn es diese Funktionalität intern nachbildet, obwohl es auf die MySQL-Client-API zugreifen könnte). Weiterhin gibt es eine Menge netter Fetch-Möglichkeiten unter PDO, beispielsweise eine komplette Spalte auf einmal fetchen können, ohne dafür eine Schleife verwenden zu müssen.

Das Problem mit den Charset - nun, zumindest für Latin/ISO-8859 und UTF-8 kann man es mit SET NAMES lösen. Und wenn man wirklich portabel programmieren will, kommt man um eine Fallunterscheidung beim Einstellen des Charsets, so es sich mit einem Statement erledigen lässt, für die einzelnen drunterliegenden Systeme wohl nicht umhin.

echo "$verabschiedung $name";