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でウェブサイトを作るとき、
データベース接続後に
をしてからSQLを実行していました。
これをすればMySQLのmy.conf が触れなくても
問題なかったんですが、
このクエリーは脆弱性がある↓そうで
SET NAMESは禁止
このブログの筆者がこの記事のコメント内で
というわけで、
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になってますね。
データベースにUTF-8で文字を格納して出してみると
???となることがあります。
その対策として SET NAMES utf8 を使ってました。
が、SET NAMES には脆弱性があるそうで、
これを使わない方法を模索してみました。
MySQLとPHPでウェブサイトを作るとき、
データベース接続後に
をしてから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になってますね。
8人中、8人(100.00%)がよい記事だとと投票しています。
| この記事はどうですか? | : 8 | : 0 |
Search
Categories
Tags
New Comments
08/18 17:48:30
kennyqi
お役に立ててうれしいです!>>
07/29 10:29:40
jun
お邪魔しました☆の間違いです。失礼いたしました!>>
07/29 10:28:41
jun
ミュクルを聞く方法を探していたらこちらにお邪魔した☆最近韓...>>
03/23 09:52:56
kennyqi
Google撤退を発表しちゃいましたね。 今後、活動拠点を香港...>>
11/26 09:22:28
kennyqi
CPUの稼働率、 DBとWebサーバを分けたら落ち着きました^^;>>
Archives
カテゴリ別記事リスト
3月, 2010
2月, 2010
11月, 2009
9月, 2009
7月, 2009
4月, 2009
3月, 2009
12月, 2008
10月, 2008
2月, 2008
12月, 2007
Memo
» フリーWebテンプレート
» 携帯絵文字一覧
» 無料ロゴメーカー
Categories
Tags
文字化け | メールサーバ | UTF-8 | エラー | HDD | Softbank | Google | AU | NIC | Postfix | CentOS4 | CentOS | Apache | MySQL | 携帯 | Nucleus | PHP | SEO | CentOS5 | テンプレート
New Comments
08/18 17:48:30
kennyqi
お役に立ててうれしいです!>>
07/29 10:29:40
jun
お邪魔しました☆の間違いです。失礼いたしました!>>
07/29 10:28:41
jun
ミュクルを聞く方法を探していたらこちらにお邪魔した☆最近韓...>>
03/23 09:52:56
kennyqi
Google撤退を発表しちゃいましたね。 今後、活動拠点を香港...>>
11/26 09:22:28
kennyqi
CPUの稼働率、 DBとWebサーバを分けたら落ち着きました^^;>>
Archives
カテゴリ別記事リスト
3月, 2010
2月, 2010
11月, 2009
9月, 2009
7月, 2009
4月, 2009
3月, 2009
12月, 2008
10月, 2008
2月, 2008
12月, 2007
Memo
» フリーWebテンプレート
» 携帯絵文字一覧
» 無料ロゴメーカー