PHPとMySQLに関する文字化けにまつわる私的体験談

MySQLphpMyAdmin周りの文字化け関連の話題はよく聞きますが、些細なことではまっていたのでメモ。

概要

phpMyAdminから作成したデータベースにレコードを追加すると日本語が化ける。試行錯誤の結果、テーブルを作り直したらうまいこといった。orz

  1. テーブルを作る
  2. レコードを追加する
  3. 化けてる
  4. いろいろいじくる(※2から4繰り返し)

としてたんですが、1にまで遡ったら、正常に表示されましたっていう。

環境
詳細

文字エンコーディングUTF-8。htmlソースをUTF-8で記述し、metaタグでも指定。

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

また、サイト全体に対する指定として.htaccessで以下のように記述し、httpレベルでのエンコーディング指定も行う。

AddType "text/html; charset=UTF-8" .html .php

php.iniは最終的に以下のような設定とした。

mbstring.internal_encoding = "utf-8"
mbstring.language = "Japanese"
mbstring.http_input = "utf-8"
mbstring.http_output = "utf-8"
mbstring.encoding_translation = On
mbstring.detect_order = "utf-8"
mbstring.substitute_character = none

UTF-8」と「utf-8」は多分区別されないとは思うけど、phpinfo()で確認できる他の設定項目が小文字で「utf-8」となっていたので一応合わせておく。
また、" "で文字列を囲っていますが、これも別に必要ないのかも。さくらインターネットのサーバコントロールパネルから見ることができるphp.iniの編集例が" "で囲ってあったので同じようにしてみた。
コントロールパネルのphp.ini編集用ウィンドウに上記設定を書き込み保存すると、所定の場所にphp.iniが生成されている。その状態でphpinfo()の内容を確認すると以下のようになっているはず。

これでPHP側の設定は終わり。あとはphpMyAdminからエンコーディングの指定を確認する。
ログイン画面と、ログイン後すぐのトップ画面でエンコーディングが正しく指定されているか確認する。違っている場合は変更。

ログイン画面

トップ画面


この状態で新しくテーブルを作り、レコードを追加すると文字化けすることなく正常に表示された。