MySQL、PHP 日本語が?になる時

 晴れ、気温は15度くらい。涼しい。

 先週、MySQLCSVのデータを取り込む時の方法を書いたが、もう一つ困ったことが起きた。それは文字化けである。

 インターネットを散歩していると、本当にたまにであるがエンコードの違いにより正しく表示されないページに出会う事がある。そういった事も以前と比べて本当に少なくなった。

 それもHTMLでページを作る際、文字化けしないように最初に文字種を宣言するという作法がきちんと行われているからである。

 これはイントラネットの話なのだが、前回、csvのデータを取り込む際、csvのデータは、MySQLの文字形式に合わせなければならないと書いた。

 MySQLの文字形式がUTF-8の場合、csvの文字形式がSJISだった場合、日本語の文字は、全て取り込まれず空白になってしまう。

 そこで、UTF-8で取り込んだMySQLのデータを今度、HTML内でPHPなどを使て表示する場合、HTMLのページは、UTF-8にしておかないと取り出したデータは文字化けしてしまう。

 きっとイントラネット内のホームページなど昔からあるものなどは、SJISを冒頭に宣言していることが多いのではないだろうか?その場合、必ずHTMLのmetaのchrsetをUTF-8に替える必要がある。当然HTML文もUTF-8で保存して置く事が必要である。

 そうして、MySQLのデータをPHPなどで取り出し表示させればよいのだが、そこで起きるのが取り出したデータの日本語が「?」になってしまう現象である。

 MySQLのデータとHTMLでの文字形式をUTF-8に揃えたにも係らずまたもや文字化けしてしまうのである。原因は、判らないというか、HTMLを作った人に聞くしかない。

 そこで、PHPでデータベースにクエリーをかける際、文字形式がUTF-8であると宣言する必要がある。

 mysql_query("SET NAMES utf8");

これをクエリーをかける前に追加すれば、今まで日本語が「?」で表示されていたものが正常に表示されるようになる。

イントラネットでは上記で良いが、公開するような場合は、

 mysql_set_charset("utf8");

SQLインジェクション対策に使用する。ただし、PHPのバージョンが5.2.2以上で無いと使用できない。


 こういったバージョンの問題も、PHPを使用していると良くぶつかってしまう。以前作ったPHPのプログラムが、走らせるとエラー文を山のように吐き出す。古いバージョンなら動くため、過去のものを動かすために構成を変えずそのまま使用している場合が多いのではないだろうか。

 更にまた数年すれば、必ずバージョンアップは必要である。しかしその頃、それを書いた人が同じ部署にいるとは限らない。移動している確率が高いだろう。その時にそれを見直すことを考えたら、今のうちに見直しておく必要もある。

 結構イントラネットを構成していると、簡単なものでもPHPで作られているものがどんどんたまって来るものである。全てのものを簡単に作り替えることができるのならこれ程楽なことは無い。しかし、現実的にはそれを行う時間が必要という事である。