さくらサーバーで Shift-JIS → UTF-8に変換しMYSQL登録で文字化けしないようにする。

2019年10月17日

いろいろ試してうまくいったので、忘備録です。
サイトの文字コードを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を指定すると、文字化けが発生します。何気に一番はまった部分でした。

 

続きはまた次回。

今回のレポートは以上です。
読んでいただいてありがとうございました。


ホームページに関するお悩み事やご相談事がございましたら私どもまでご連絡ください。 鋭意ご対応申し上げます。
ホームページのご提案もさせていただいております

忘備録, MYSQL, PHP

Posted by OBATA