PostgreSQLのclient_encodingをdatabase.ymlから指定する
ちょっと無理矢理な感じがしなくもないですが。
@shimooka symfonyというかPropel1.2はMySQLしかencodingの変更できなかったような気がします。
EUC-JPな既存DBがあって、王道はpostgresql.confのclient_encodingを設定することなんでしょうけど。。。むぅ。どうしたもんかなと思っていたんですが、database.ymlで
all: service_db: class: sfPropelDatabase param: dsn: pgsql://dbuser:dbpass@dbserver:5432/service_db persistent: true encoding: utf8
のように記述すると、pg_set_client_encoding関数を呼び出してclient_encodingを設定するようにしました。以下、symfony1.0.16に付属するCreole用のパッチ。
$ diff -c symfony/vendor/creole/drivers/pgsql/PgSQLConnection.php.org symfony/vendor/creole/drivers/pgsql/PgSQLConnection.php *** symfony/vendor/creole/drivers/pgsql/PgSQLConnection.php.org 2008-06-24 19:11:58.000000000 +0900 --- symfony/vendor/creole/drivers/pgsql/PgSQLConnection.php 2008-06-24 19:12:33.000000000 +0900 *************** *** 105,110 **** --- 105,116 ---- throw new SQLException('Could not connect', $php_errormsg, $cleanconnstr); } + if (!empty($dsninfo['encoding'])) { + if (pg_set_client_encoding($conn, $dsninfo['encoding']) !== 0) { + throw new SQLException('Could not set client encoding to ' . $dsninfo['encoding']); + } + } + $this->dblink = $conn; } $
Creoleといえども結局はDB/MDB2と同じで、ドライバ毎にnativeの関数を使い分けてるだけなんですね。ソース見といて良かった。まあ、「symfonyのアップデートの時、どうするの?」とかありますが、今回はこんな感じで逃げてます。
いろいろと情報をいただいたkey3さん、Kiskeさん。ありがとうございましたー。またよろしくです;-)