PHP+MySQL+UTF-8

[simple-way:~] CTO% cat 2007年08月29日04:47.txt

文字コードの問題は解決するのにとても時間がかかります。

今日も文字コードに悩まされてこんな時間になってしまいました・・・。これ書いたらねます・・・。

たぶんウェブプログラムを作る時はデータベースもソースコードもUTF-8で書くのが安全だと思います。いくらかの文字の変換に問題が起こるようですが、多少の犠牲はあるにせよUTF-8が一番問題の起きにくい文字コードであると思っています。

しかし、世の中にはそれを阻むサーバーもあるわけで。レンタルサーバーを使っているとデータベースや言語エンジンの設定は変更できないため、どうしても提供された環境の文字コードを使わざるを得なくなります。

それでも何とかUTF-8を活用しつつ、文字コードの問題を抑えたい。

そこで、今まで文字コードの問題にぶつかり、そのたびに学んできたことをここにまとめておこうと思います。対象とする環境はPHP4.3以上、MySQL4.1以上です。おそらく以下の手法はPHP5およびMySQL5でも有効だと思います。


・ソースコードとHTMLの文字コード
まずソースコードとHTMLの文字コードを統一しておかなければ意味がありません。もちろんUTF-8を使うわけですが、このときBOMヘッダをつけてはいけません。多くのプログラムではBOMの有無にかかわらず動作・表示してくれますが、古いプログラムではBOM付のデータは無効なものとして扱われる可能性があります。


・作成するテーブル
CREATE TABLE 時に DEFAULT CHARACTER SET を設定します。デフォルトの文字コードを指定することで挿入されるデータがUTF-8になります。具体的には以下のようにクエリを実行します。

CREATE TABLE hoge (
 hoge_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
 hoge_name TEXT
) DEFAULT CHARACTER SET utf8;


・データベース接続時
データベース接続直後に SET NAMES クエリを実行します。そうすることでその後のすべてのクエリ(同じ接続が維持されている限り)はUTF-8で送信されることをMySQLに教えることができます。具体的には以下のようにクエリを実行します。

mysql_connect('host', 'user', 'pass');
mysql_query('SET NAMES utf8');

ちなみに本当はSET NAMESをプログラムから実行してはいけないようです(参考)。PHP5.1以上にはmysqli_set_charsetが用意されているので、この関数を呼び出すのが好ましいでしょう。(しかしながら、バージョン互換のプログラムを書くときには今のところは使えないですね・・・)


・PHPの文字コードに関する設定
ソースコードをUTF-8で書いているので、それをPHPに教えてあげた方が問題が起きにくくなります。PHPの設定はphp.iniで行うのが一般的ですが、htaccessを使っても設定を変更することができます(php.iniで許可されている場合)。具体的には以下のようなディレクティブを設定します。

php_value mbstring.script_encoding UTF-8


とりあえず今のところやっている対策はこれくらいでしょうかね。さぁ寝よう・・・。


[simple-way:~] CTO% []

Blog Top

プロフィール
CTO
CTO

  • 1985年7月
    山梨県生まれ

  • 2002年12月
    日本学生科学賞 ソリューション部門 入選1等
    (巨大壁画設計アプリケーションの開発)

  • 2004年4月
    AC入試にて筑波大学第三学群情報学類へ入学

  • 2007年4月
    株式会社シンプルウェイ
    取締役 兼 CTO(最高技術責任者)に就任

  • 2008年3月
    筑波大学第三学群情報学類を無事卒業!!


QRコード
QRCODE