-
9月042009
MySQLとPHPの連携:: set names utf8以外の文字化け対策
No CommentsMySQL5.5.xにアップグレードして
→ 再起動できない。
→ 「default-character-set」が使えず文字化けする
という方は、下記の記事も参考にしてください。MySQL 5.5で「default-character-set」が使えず文字化けする→「character-set-server」にするとOK
2011.5.20
MySQL、PHPでUFT-8のウェブサイトをよく作りますが
データベースにUTF-8で文字を格納して出してみると
???となることがあります。
その対策として SET NAMES utf8 を使ってました。
が、SET NAMES には脆弱性があるそうで、
これを使わない方法を模索してみました。
MySQLとPHPでウェブサイトを作るとき、
データベース接続後にmysql_query("set names utf8");をしてからSQLを実行していました。
これをすればMySQLのmy.conf が触れなくても
問題なかったんですが、
このクエリーは脆弱性がある↓そうで
SET NAMESは禁止
このブログの筆者がこの記事のコメント内でSET NAMES, SET CLIENT ENCODINGを利用しないで、mysql_set_charset, pg_set_client_encodingを利用すれば、このような不整合が発生しないので問題も発生しなくなります。
というわけで、
mysql_set_charset('utf8');を使うならいいとか。
おっと、ここで問題が。。
CentOS5だと
yumでインストールできるPHPの最新バージョンが
5.1.6 で
mysql_set_charset が使えるのはPHP5.2.2以上で提供されている。。。
>> PHPプロ!Tips
そこで、なんとかならないかと検討してみたら、
my.confに下記の記述をすればうまくいきました。
結局サーバ側を触ることになりました^^;
my.confの[mysqld]内に[mysqld] default-character-set=utf8 skip-character-set-client-handshake
を記述します。
MySQLサーバの文字コード関係の設定がどうなっているか
ついでに調べてみました。
CentOS5 でyumしただけの状態だと
MySQLで下記のようになります。mysql> show variables like 'cha%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec)
で、SET NAMESをすると
mysql> set names utf8; Query OK, 0 rows affected (0.00 sec) mysql> show variables like 'cha%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.01 sec)
character_set_client
character_set_connection
character_set_results
character_set_system
がutf8になってます。
で、my.confの[mysqld]に
default-character-set=utf8
skip-character-set-client-handshake
を追加すると、mysql> show variables like 'cha%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec)
となります。
character_set_database
character_set_server
もutf8になってますね。





