How to make Horde connect to mysql with UTF-8 character set?
Posted
by
jkj
on Server Fault
See other posts from Server Fault
or by jkj
Published on 2011-06-30T12:51:48Z
Indexed on
2012/09/03
21:40 UTC
Read the original article
Hit count: 377
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__);
© Server Fault or respective owner