Zend_DB: Datenbankverbindungen mit Zeichensatz UTF-8

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.

Werbung


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

mysql_set_charset('utf8');

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

$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:

$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:

[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:

[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

Veröffentlicht von

Uli

IT-Nerd und Admin

4 Gedanken zu „Zend_DB: Datenbankverbindungen mit Zeichensatz UTF-8“

  1. SUPER Beitrag! Nach einer Stunde mit filtern und htmlentities ohne ein Ergebnis hat mich google auf diesen Post aufmerksam gemacht.

    Ich habe JSON kodierte Antworten von einem Zend Controller, der immer Text abschnitt, sobald dieser einen Umlaut beinhaltet.

    Kodierung etc. hatte nichts gebracht, aber

    resources.db.params.charset = utf8

    war die Lösung.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.