How to tell horde 3.3.11 to use UTF-8 for it's mysql connection? The $conf['sql']['charset'] only tells horde what is expected from the database.
Horde uses MDB2 to connect to mysql. Is there way to force MDB2 or mysql character_set_client from php.ini?
So far I found two workarounds:
Force mysql to ignore character set requested by client
[mysqld]
skip-character-set-client-handshake=1
default-character-set=utf8
Force mysql to run SET NAMES utf8 on every connection
[mysqld]
init-connect='SET NAMES utf8'
Both have drawbacks on multi user mysql server. The first disables converting character sets alltogether and the second one forces every connection to produce UTF-8.
[EDIT]
Found the problem. The 'charset' parameter was unset the last minute before sending to SQL backend. This is probably due to mysql not being able to digest utf-8 but utf8. Mysql specific mapping is required to make it work.
I just worked around it by translating utf-8 - utf8. Won't work with any other databases with this patch though.
--- lib/Horde/Share/sql.php.orig 2011-07-04 17:09:33.349334890 +0300
+++ lib/Horde/Share/sql.php 2011-07-04 17:11:06.238636462 +0300
@@ -753,7 +753,13 @@
/* Connect to the sql server using the supplied parameters. */
require_once 'MDB2.php';
$params = $this->_params;
- unset($params['charset']);
+
+ if ($params['charset'] == 'utf-8') {
+ $params['charset'] = 'utf8';
+ } else {
+ unset($params['charset']);
+ }
+
$this->_write_db = &MDB2::factory($params);
if (is_a($this->_write_db, 'PEAR_Error')) {
Horde::fatal($this->_write_db, __FILE__, __LINE__);
@@ -792,7 +798,13 @@
/* Check if we need to set up the read DB connection seperately. */
if (!empty($this->_params['splitread'])) {
$params = array_merge($params, $this->_params['read']);
- unset($params['charset']);
+
+ if ($params['charset'] == 'utf-8') {
+ $params['charset'] = 'utf8';
+ } else {
+ unset($params['charset']);
+ }
+
$this->_db = &MDB2::singleton($params);
if (is_a($this->_db, 'PEAR_Error')) {
Horde::fatal($this->_db, __FILE__, __LINE__);