スポンサードリンク

2012年2月19日日曜日

文字化け問題 PHP&MySQL

PHPもMySQLもすべてUTF8にしていたつもりだが、
いざPHPでデータベースのレコード拾ったら文字化けしてしまった。
そのときの解決についての備忘録。


<PHPバージョン>
5.3.3

<MySQLバージョン>
5.1.61

■PHP側設定 (/etc/php.ini)
※関係キーのみ抜粋

<変更前>mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = UTF-8
mbstring.http_output = UTF-8
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_character = "";
default_charset = "UTF-8"

<変更後>
PHP.iniは何も変更していない。
※色々調べたら、設定ではエンコード変換はさせずに、
 PHPソース内でエンコード設定を毎回書くべきだ・・・という玄人の人の
 意見があった。設定で内部で自動変換してしまうかららしい。
 できるかぎりソース内で文字エンコード設定するようにしていこう!

■MySQL側設定 (/etc/my.cnf)
※全設定記載

<変更前>
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0

#old_passwords=1
;default-character-set=utf8
character-set-server=utf8
;skip-character-set-client-handshake

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

<変更後>
赤色部分のコメントアウトを除去した。
skip-character-set-client-handshakeというキーが重要のようだ。
これがなければ文字化けしてしまうらしい。

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0

#old_passwords=1 
default-character-set=utf8
character-set-server=utf8 
skip-character-set-client-handshake

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

以上

0 件のコメント:

コメントを投稿