KennyQiのPHPメモと息抜きブログ

KennyQi(ケニーチー)のブログへようこそ
Web制作 PHP開発のメモと息抜きブログ
ウェブ開発・デザイン・Nucleusのメモや旅日記などを綴っています
MySQLとPHPの連携:: set names utf8以外の文字化け対策
2009年09月04日 | Linux | Posted by: kennyqi | 5533 PV
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を利用すれば、このような不整合が発生しないので問題も発生しなくなります。

yohgaki's blog




というわけで、

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になってますね。

8人中、8人(100.00%)がよい記事だとと投票しています。
この記事はどうですか?
: 8
: 0

Comments
No comments yet

Add Comment