PHP 5.4.xとMySQL(5.6.20)の構成で、PHPから日本語をデータベース内に保存したところ、phpMyAdmin上でその日本を見ると文字化けしてしまいました。逆に、phpMyAdmin上で入力した日本語はPHPからクエリして表示すると「???」になってしまいハマった対策を残します。尚、データベースに入出力した以外の日本語文字列は問題ありませんでした。
これが発生した環境は、XAMPP、NetBeasn、PHPファイルともにUTF-8を扱えるように設定済み、MySQL内のデータベースは、照合順序は「utf8_unicode_ci (UNICODE(多言語)、大文字小文字を区別しない)」で作成したデータベースといった環境です。
専用サーバーであればMySQLのmy.confを編集して修正するのが簡単ですが、共用サーバーとなるとその方法での対策は難しいのでPHP側で対策する方法を紹介します。
≪対策≫
クライアントの文字セットをmysql_set_charset関数を利用してUTF-8に設定すれば良い。
// データベースに接続 $link = mysql_connect('localhost', 'root', ''); // クライアントの文字セットを設定 mysql_set_charset('utf8', $link);
※上記サンプルはエラー処理は考慮されていません。
ただし、PHPマニュアルによるとこの方法はPHP 5.5.0より下図の通り非推奨になったとのこと。
PHP 5.5.0以降で開発する場合は、紹介されている代替の方法を採用してください。
≪注意≫
この対策をネット調査している際に、データベースに対し、
SET NAMES UTF8
とクエリを実行して文字セットを変更したら日本語の文字化けが解消したと対策を紹介されています。
確かにこの方法でも対策は出来、以前はこの方法が一般的だったようですが、SQLインジェクションの脆弱性があることが判明しているので推奨されません。