formからPOSTのシナリオ
1、formからポスト
ブラウザはページのキャラセットでサーバにデータを送る。<form>タグでキャラセットを指定してある場合もある。携帯の場合は常にshift-jisで送ってくる場合もある。
2、PHPが受取る
PHPが受取る際には、ディレクティブmbstring.encoding_translationが有効であれば、入力エンコードをmbstring.http_inputに設定されているエンコーディングとして扱い内部エンコーディングmbstring.internal_encodingに変換する。mbstring.http_inputが”pass”であれば何もしない。これらのディレクティブはphp.iniなどで設定するかApacheのコンフィグで設定する。.htaccessが利用できればここでも設定できる。以下は.htaccessで設定した例。
<IfModule mod_php5.c>
php_flag output_buffering Off
php_value output_handler none
php_value default_charset euc-jp
php_value mbstring.language japanese
php_flag mbstring.encoding_translation On
php_value mbstring.http_input pass
php_value mbstring.http_output pass
php_value mbstring.internal_encoding euc-jp
php_value mbstring.substitute_character none
</IfModule>
3、PHPがMySQLサーバに送る。
PHPはサーバに接続後、”SET NAMES xxx”を使ってエンコーディングを設定できる。デフォルト値はMySQLのサーバ変数character_set_connectionで指定される。MySQLは受取ったデータをこの値でエンコーディングされているものとして扱う。をMySQL ver4以上は内部的にはUTF8でデータを持っている(character_set_system)ので、このデータをUTF8に変換して保存する。データベースやテーブルにはcollationという属性があるが、これはテーブルデータを”ORDER BY”で並び替えるときに使われる。
character_set_connectionの実行時の値を確認するには、MySQLコマンドラインから、”SHOW VARIABLES;”を発行する。
とここまで調べたが実際にはcharacter_set_clientとかもあって非常にわかりずらいのでスルー。