いざ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 件のコメント:
コメントを投稿