いろいろ試してうまくいったので、忘備録です。
サイトの文字コードをShift-JISで組み込む場合、web←→php 間のやり取りもShift-JISになりますが、Shift-JIS のままMYSQLに登録すると、一部の文字コードがMYSQLで文字化けを起こします。これを何とかしようととする場合、MYSQLで文字化けしない文字コードに変換して登録するのがベターです。
テスト環境ではうまくいきましたが、さくらサーバーで試すと文字化けする。
テスト環境で、データを登録するときに UTF-8に変換し、読み出すときに Shift-JISに再変換することで、文字化けさせずに登録することができました。
今度は、実機テストとして、さくらサーバーに入れてテストしてみたところ、機種依存文字(①、②、はしごだかなど)が文字化けしました。
どうやら、サーバーの環境に左右される要因があるようでした。
文字化けする要因は、登録しようとしている文字コードと、サーバー側の文字コードが不一致の場合に発生します。
そこで、「SHOW VARIABLES LIKE ‘character%’」でサーバーの文字コードを調べてみました。
さくらサーバーはいろいろと特殊
テスト環境は、自分でMy.iniを設定できるもので、テスト環境の文字コードを調べてみるとすべてutf8でした。
それに対し、さくらサーバーの文字コードを調べてみると、utf8とujisが混在しており、これが原因で文字化けしているようでした。
解決策としては、ujisになっている部分をutf8にすることですが、当然さくらサーバーのMy.iniは変更できません。
そこで、いろいろと調べてみました。
データベース接続時にSET NAMES
わかっておられる方には当たり前のことかと思いますが、文字コードに気づいていない時は、わからないものです。
とりあえず、PHPでSHOW VARIABLES LIKE ‘character%’を表示する処理を組み、データベース接続時に SET NAMES を行い、サーバーの文字コードがどう変化するかを見てみました。
まず「SET CHARACTER SET utf8」を試してみたところ、character_set_results、character_set_clientがujis→utf8に変化したものの、character_set_connectionとcharacter_set_serverがujisのまま。試しに文字を登録してみると、文字化けしました。
次に、「SET NAMES utf8」を付け足してみたところ、変化なし。文字化けも発生したまま。
もしかして、2つも設定する必要がないのではないかと思い、「SET CHARACTER SET utf8」を外してみたところ、character_set_connectionがutf8に変化しました。
そして、文字化けも発生しなくなりました。
いままで大した意味がないと思っていた、SET NAMES でしたが、文字化けのさせないためには、かなり重要な設定であることがわかりました。
あともう一つ陥りやすい罠として、文字コード変換を行う際には、”UTF-8″と設定しますが、SET NAMESの場合は、”utf8″と間にハイフンが入りません。
間違ってUTF-8を指定すると、文字化けが発生します。何気に一番はまった部分でした。
続きはまた次回。