肉とビールとパンケーキ by @sotarok

少し大人になった「肉とご飯と甘いもの」

EthnaでAppObjectを使うときデータベースの文字コードを指定する

えーと、自分のしてる方法が正しいかわからないんですが、サーバ側のDBの文字コードPHPの内部コーディングやアウトプットの文字コードが違ったりとかすると、ちゃんと指定してないと文字化けが起こったりするんですよね。*1逆に言えばMySQLサーバのデフォルトがUTF8とかでも、EUC-JP使いたければ、文字コードを明示して指定すれば文字化けはしない。と思う(笑)


というわけで、どう使うときにでも文字コードが指定できるようにしたくて。

で、MySQLエンコードをセットするときは

SET NAMES character_set_name

とやるので、まぁできればこのクエリーを投げたいわけです。ちなみに character_set_name はEUCなら ujis です。間違いやすいですが。


基本的に、DBの入出力はO/RマッピングクラスのAppObjectを使ってるものという前提で、AppObjectのコンストラクタ文字コードをセットするクエリーを投げることにしました。

<?
class ProjectID_Sample extends Ethna_AppObject
{
    function ProjectID_Sample(&$backend, $key_type = null, $key = null, $prop = null)
    {
        parent::Ethna_AppObject(&$backend, $key_type, $key, $prop);
        
        $this->db->query("SET NAMES ujis");
    }
    
    ...

こうすればAppObjectが呼ばれるたびに文字コードをセットするようになります。ということで。



あーでもどういう風に実装するのが一番楽なのかが微妙。この場合、AppObjectの数だけこの作業が必要になってしまうわけで。。


どうせだったら、Controllerで指定するDBクラスで

<?
...
    var $class = array(
        ...
        'db'            => 'MyEthna_DB_PEAR',
        //'db'            => 'Ethna_DB_PEAR',
        ...

とかして、このMyEthna_DB_PEARてクラスのコンストラクタ文字コード決めてあげればいいのかな。そしたら getDB でとってきたときも AppObject つかったときも、SET NAMES されるかなー??とか。。
とりあえずは文字化け直った。



まぁとりあえずAppObject使う前提でいこうと思います。

*1:まぁこれは別にEthnaに限ったことではないですが。