PHPとMySQLの文字コード

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とかもあって非常にわかりずらいのでスルー。

Leave a Reply

Your email address will not be published. Required fields are marked *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)