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さん。ありがとうございましたー。またよろしくです;-)