PHP 5.3.3 & MySQLの日本語文字化け対応

PHP 5.3.3 日本語文字化け対応

PHP 5.3.3とMySQLの環境構築を行った際に、DBテーブルに保存された日本語データがブラウザ上で文字化けしてしまったので、対応方法をメモ。

環境: CentOS 6.9 (Docker), PHP 5.3.3, MySQL 5.7

解決した方法 (結論)

PHPプログラム内、PDOのインスタンス生成時に文字コードオプションを設定する

$db = new PDO(
    'mysql:host=db;port=3306;dbname=prefecture;',
    'root',
    'password',
    array(
        PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET `utf8`"
    )
);

DB抽象化ライブラリ PDOのインスタンス生成時、コンストラクタ実行時の4つ目の引数としてオプション(配列)が指定できるので、
上記のようにMySQL接続時のプロパティ「MYSQL_ATTR_INIT_COMMAND」に文字コードUTF-8を設定することで日本語の文字化けを解消。

今回のようにPHP5.3.6以前の旧バージョンでは以下のように第一引数にcharsetを指定できないようである。

'mysql:host=db;port=3306;dbname=prefecture;charset=utf8;',

PDOマニュアル

Before

After

(補足) 他の日本語有効化設定

補足として、前述の対応以外に同環境(PHP+MySQL)で一般的に日本語を有効化するために必要な設定を以下にまとめる。

なお、前提としてPHPで日本語を扱うためには拡張ライブラリである、mbstringが有効になっている必要があるため、環境構築の際にはPHP本体と合わせて必ずインストールする。

CentOSの場合

yum install -y php php-mbstring

PHPの設定 (php.ini)

php.ini内に記載するmbstringの設定

[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
default_mimetype = "text/html"
default_charset = "UTF-8"
output_buffering = "On"
mbstring.http_input = "auto"
mbstring.http_output = "UTF-8"
mbstring.encoding_translation = "On"
mbstring.detect_order = "UTF-8,SJIS,EUC-JP,JIS,ASCII"
mbstring.substitute_character = "none"
mbstring.func_overload = "0"
mbstring.strict_detection = "Off"
extension = "php_mbstring.dll"

MySQLの設定 (my.cnf)

MySQLの設定ファイル my.cnfで設定する項目

/etc/mysql/conf.d/my.cnf

[mysqld]
character-set-server=utf8

[mysql]
default-character-set=utf8

[mysqldump]
default-character-set=utf8

[client]
default-character-set=utf8

※ なお、これらを設定した場合でも前述したPDOオプションを指定していないとブラウザ上での文字化けは解消しなかった

Follow me!