PHP, MySQLでの5C問題

phpでMySQLをDBとして使ったアプリケーションを作成する時に、Shift_JISを使っていると、5Cの問題に出くわし毎度苦戦してました。

毎回忘れてるので、メモ。。

携帯のサイトとかどうしてもShift_JISでアプリを組みたい場合、結局は

標準関数のmysql_set_charsetを使う

というのがポイントでした。

答えが分かると単純なことだったのですが、毎度ハマってます。

マニュアルにも

注意: 文字セットを変更するにはこの方法を使うことを推奨します。 mysql_query()SET NAMES .. を実行する方法はお勧めできません。

と書いてありますね。(PHPだとマニュアルを読むのはかなり大事)

ただ、

注意: この関数は、MySQL 5.0.7 以降でないと使用できません。

ということで、バージョンによってはかなりShift_JISの扱いが難しくなります。

今までは

$db->query(“SET NAMES sjis”);
とかってSET NAMESだけ実行してたけど、「能」、「ソ」とかいわゆる2バイト目が5Cの文字の扱いで、mysql_real_escape_stringが余計にエスケープしてくれたりして悩んでました。
mysql_set_charset関数を使って、Shift_JISエンコーディングでMySQLを使いますよと教えてあげれば、Shift_JISの2バイト目の5Cは誤解されずに、ちゃんとエンコーディングしてくれるようです。

PHPは色々やってくれるのは良い反面、ちゃんと使いこなさないとおかしな動きするので、ちゃんとマニュアル読んで正しい使い方しないといけないですね。

参考
symfony × MySQL × Shift_JIS: 0×5c関連