Movable Type+MySQLで(本来はSET NAMES cp932と発行すべきなのに)SET NAMES sjisをMySQL Serverへ発行してしまう問題

| | 編集 | コメント(0) |

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なので、このままだと、「カッコカブ」などのいくつかの特殊文字を正しく扱えない。

これを正しくSET NAMES cp932と発行するように修正するには、/lib/MT/ObjectDriver/DBI/mysql.pmファイルの次の箇所をsjisから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のバグなので、そのままにしないように、要注意です。

Movable Typeタグの関連エントリー

Search

アーカイブ