[Akelos] MySQLでの文字コード対応

2月 12, 2009 · Posted in Akelos, PHP 

AkelosのSVNリポジトリを見てみたらいくつかバージョンアップがなされていた。
比較的暇だったこともあり今回は1つ1つソースを見てどこが変わったのかなー、と眺めていた。

その中の一つ、AkActiveRecord/AkDbAdapters/AkMysqlDbAdapter.php の変更点を見ていておっとっとと思った。

と言うのが今回の話。

MySQLで日本語を扱うとぶつかってくる文字コードの問題。
とにかくアプリ実行時に ‘SET NAMES(or CHARACTER SET) utf8’ を実行するという方法で、後はどのタイミングで実行するかというところです。Akelosでもいろいろと方法があるわけで、

  • ApplicationController ではじめに実行
  • Akelosのソースいじって、MySQL接続直後に実行

などあります。以下の参考サイトの受け売りであります。

参考:
[Akelos][php]Akelosでmysqlの文字化けをどうにかする
[Akelos] Akelos で set names utf8

はじめは Akelosのソースに手を入れる方法を採用し、
ここ最近はTanaka Blog さんの config/boot.php の最後に SET NAMES utf8 を実行する方法を採用していた。

で、今回のソースを眺めていてである AkActiveRecord/AkDbAdapters/AkMysqlDbAdapter.php の最後の方

function connect($die_on_error=true)
{
    parent::connect($die_on_error);
    if(defined('AK_SET_UTF8_ON_MYSQL_CONNECT') && AK_SET_UTF8_ON_MYSQL_CONNECT){
        if(isset($this->connection->_connectionID)){
            if(function_exists('mysql_set_charset')){
                mysql_set_charset('utf8', $this->connection->_connectionID);
            }else{
                mysql_query('SET CHARACTER SET "utf8"', $this->connection->_connectionID);
            }
        }
    }
}

とある。つまりは、config/config.php で

define('AK_SET_UTF8_ON_MYSQL_CONNECT', true);

としてあげれば、いいようである。
最近はutf8しか使わんから自分はこれでもかまわないけれども、できれば encoding に対応してほしいところである。
こんな感じだろうか。

config/database.yaml への encoding 属性追加

development:
    type: mysql
    database_file:
    port:
    database_name: mj
    user: mj
    password: mj
    options:
    encoding: utf8   ← こんなかんじかしらw

で件のAkActiveRecord/AkDbAdapters/AkMysqlDbAdapter.phpの該当箇所で

function connect($die_on_error=true) 
{
    parent::connect($die_on_error); 
    if(!empty($this->settings['encoding']){ 
        if(isset($this->connection->_connectionID)){ 
            if(function_exists('mysql_set_charset')){ 
                mysql_set_charset($this->settings['encoding'], $this->connection->_connectionID); 
            }else{
                mysql_query('SET CHARACTER SET "'.$this->settings['encoding'].'"', $this->connection->_connectionID); 
            }
        }
    }
}

ちなみに未検証です(汗)。


Comments

Leave a Reply