[Akelos] MySQLでの文字コード対応
AkelosのSVNリポジトリを見てみたらいくつかバージョンアップがなされていた。
比較的暇だったこともあり今回は1つ1つソースを見てどこが変わったのかなー、と眺めていた。
その中の一つ、AkActiveRecord/AkDbAdapters/AkMysqlDbAdapter.php の変更点を見ていておっとっとと思った。
と言うのが今回の話。
MySQLで日本語を扱うとぶつかってくる文字コードの問題。
とにかくアプリ実行時に ‘SET NAMES(or CHARACTER SET) utf8’ を実行するという方法で、後はどのタイミングで実行するかというところです。Akelosでもいろいろと方法があるわけで、
- ApplicationController ではじめに実行
- Akelosのソースいじって、MySQL接続直後に実行
などあります。以下の参考サイトの受け売りであります。
はじめは 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