Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

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

追記(2008/06/30 12:38)

Creoleのtracにチケットが登録されてたようです。Creole1.2で取り込まれる感じに見えますが、symfonyのどのバージョンで取り込まれるのかなぁ。。。