Movable Type+MySQLで(本来はSET NAMES cp932と発行すべきなのに)SET NAMES sjisをMySQL Serverへ発行してしまう問題
Movable Type + MySQLの組み合わせで使うとき、MT側ではデフォルトでキャラクタセットを指定しない。
そのため、ついついMySQL Server側で(サーバー全体に適用される)default-character-set=cp932とMySQL Serverの起動オプションまたは設定ファイル(my.cnf)で指定したくなるのだが、実はPublishCharsetとSQLSetNamesを指定することでSET NAMESを発行してくれる。
Movable Type 3.2 マニュアル - 環境設定ファイル (mt-config.cgi)
SQLSetNamesデータベースへのアクセスする際のエンコードを明示的に設定するものです。値が"1"の場合、PublishCharsetの設定値をもとに、データベースとの接続時のエンコードを指定します。MySQLやPostgreSQLを利用していて、クライアント側のエンコードを指定する必要がある場合、この値を設定してください。
あなたのデータベース環境に合うようMovable Typeを設定する方法については、「Movable Typeのインストール手順」を参照してください。
PublishCharsetデフォルトでは、ユーザー・プロフィールで「表示する言語」に選んだ言語に対応する、HTTPヘッダーの文字エンコーディングを指します。この設定を上書きしたいときは、PublishCharsetを、使用したい文字エンコーディングに設定します。 ただし変更すると、Movable Typeシステムを使うすべてのユーザーとすべてのブログの設定が変更されるので注意してください。 エンコーディングの一例は Shift_JIS です。
デフォルト値: 「表示する言語」に対応する文字エンコーディング
cp932で日本語データを扱いたい場合は、こんな感じでmt-config.cgiへ追記する。
PublishCharset Shift_JIS
SQLSetNames 1
ところが、このままだと、SET NAMES sjisを発行してしまう。
MySQL ServerではSJISに対応するCharacter SetはCP932なので、このままだと、「カッコカブ」などのいくつかの特殊文字を正しく扱えない。
my %Charset = (
'utf-8' => 'utf8',
'shift_jis' => 'sjis',
'euc-jp' => 'ujis',
そうすると、めでたくSET NAMES CP932を発行することが、General Query Logで確認できます。
macbook:~ hirohama$ sudo tail -f /Users/hirohama/data/data4/macbook.log | grep "SET NAMES"
175 Query SET NAMES cp932
ちなみに、PublishCharsetの値を、utf-8, shift_jis, euc-jp以外に設定すると、(例えばshift-jis)とか、そのままSET NAMESしちゃいます。
macbook:~ hirohama$ sudo tail -f /Users/hirohama/data/data4/macbook.log | grep "SET NAMES"173 Query SET NAMES shift-jis
明らかにMTのバグなので、そのままにしないように、要注意です。