Zend_Db and UTF-8
Today I discovered a problem with my PHP/MySQL application. SQL data coming from the Zend_Db logic has the wrong encoding.
Like IMO all modern applications should, my application only uses UTF-8 for displaying and handling all non-ASCII characters. To make the MySQL server understand that I talk UTF-8 to it, I always use the following immediately after connecting:
SET NAMES utf8; SET CHARACTER SET utf8;
The PDO interface of PHP, that Zend_Db is using, doesn’t use this, resulting in wrong character encoding (probably, the default is still latin-9 or something)
To solve this, you can extend the Zend_Db_Adapter_Pdo_Mysql class and use the extended class instead for setting up the connection in bootstrap.php:
class DbAdapter_Pdo_Mysql extends Zend_Db_Adapter_Pdo_Mysql { protected function _connect() { // if we already have a PDO object, no need to re-connect. if ($this->_connection) return; parent::_connect(); $this->query('SET NAMES utf8'); $this->query('SET CHARACTER SET utf8'); } }
Now replace code like this in your bootstrap.ini:
$dbAdapter = new Zend_Db_Adapter_Pdo_Mysql(array( 'host' => 'localhost', 'username' => $dbuser, 'password' => $dbpass, 'dbname' => $db )); $registry->set('dbAdapter', $dbAdapter); Zend_Db_Table_Abstract::setDefaultAdapter($dbAdapter);
by this:
$dbAdapter = new DbAdapter_Pdo_Mysql(array( 'host' => 'localhost', 'username' => $dbuser, 'password' => $dbpass, 'dbname' => $db )); $registry->set('dbAdapter', $dbAdapter); Zend_Db_Table_Abstract::setDefaultAdapter($dbAdapter);
Wow, problem solved That’s an easy character encoding problemen today
December 14th, 2008 at 7:15 pm
[...] here to read the rest: Zend_Db and UTF-8 Related ArticlesBookmarksTags Removing UTF-8 BOM with PHP5 PHP6 should come with unicode [...]