Ein leidiges Problem im Webdevelopment sind die verschiedenen Zeichensätze. Viele Anbieter von Datenbanken setzen latin-1 als Standard, was gerade bei Seiten, die sich voll international ausrichten wollen, ein wenig Probleme bereiten kann. Oft führt das zu defekten Ausgaben. In diesem Beitrag möchte ich ein paar Lösungen für das Problem aufzeigen und zum Schluss die Lösung anhand des Zend Framework kurz zeigen.

Für die Extension mysql kann man natürlich einfach mittels:

1
mysql_set_charset('utf8');

die Verbindung nach dem Verbindungsaufbau auf UTF-8 umstellen. pdo_mysql ist nicht viel komplizierter:

1
2
3
4
5
$db = new PDO(
 "mysql:host=localhost;dbname=DEINEDATENBANK",
 'DEINNUTZERNAME', 'DEINPASSWORT',
 array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
);

Leider gibt das Probleme, wenn das verwendete Framework für die Datenbankverbindung Lazy-Connection verwendet bei dem die Verbindung zum Server zu Beginn der Laufzeit definiert, jedoch erst bei ersten eingehenden Query geöffnet wird. Da ich gerne mit Zend Framework und pdo_mysql arbeite, gibt es einen trick, wie man trotzdem die Verbindung auf UTF-8 umschalten kann:

1
2
3
4
5
6
7
8
$params = array(
 'host' => 'localhost',
 'username' => 'DEINNUTZERNAME',
 'password' => 'DEINPASSWORT',
 'dbname' => 'DEINEDATENBANK',
 'driver_options' => array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8;');
);
$db = Zend_Db::factory('PDO_MYSQL', $params);

Dies kann natürlich im Konfigurationsteil noch etwas verfeinert werden, aber ich denke, die Idee ist klar.

UPDATE: In Zend_Application  könnte die INI-Config so aussehen:

1
2
3
4
5
6
7
8
[production]
resources.db.adapter = "pdo_mysql"
resources.db.params.host = "localhost"
resources.db.params.username = "DEINNUTZERNAME"
resources.db.params.password = "DEINPASSWORT"
resources.db.params.dbname = "DEINEDATENBANK"
resources.db.params.driver_options.1002 = "SET NAMES UTF8;"
resources.db.isDefaultTableAdapter = true

Update #2: Zend Framework 1.8 bringt für alle unterstützten Datenbankadapter mittlerweile  charset-support mit sich, der wie folgt aussieht:

1
2
3
4
5
6
7
8
[production]
resources.db.adapter = "pdo_mysql"
resources.db.params.host = "localhost"
resources.db.params.username = "DEINNUTZERNAME"
resources.db.params.password = "DEINPASSWORT"
resources.db.params.dbname = "DEINEDATENBANK"
resources.db.params.charset = utf8
resources.db.isDefaultTableAdapter = true