KennyQiのPHPメモと息抜きブログ
KennyQi(ケニーチー)のブログへようこそ
Web制作 PHP開発のメモと息抜きブログ
ウェブ開発・デザイン・Nucleusのメモや旅日記などを綴っています
MySQLとPHPの連携:: set names utf8以外の文字化け対策
2009年09月04日 | Linux | Posted by: kennyqi
| 2630 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になってますね。
Search
Categories
Tags
New Comments
11/26 09:22:28
kennyqi
CPUの稼働率、 DBとWebサーバを分けたら落ち着きました^^;>>
11/05 02:37:46
kennyqi
この設定をしたら、サーバのCPU稼働率が100%になる時間が出...>>
08/10 11:46:27
kennyqi
2009年8月15日よりAmazonAPIは 電子署名による取得が必須と...>>
01/09 00:43:25
kennyqi
どうもありがとうございます。 写真はわけたほうがみやすい...>>
01/09 00:36:48
Motoo
早速旅行記おめでとうございます。 ただ、画像がおおきすぎ...>>
Archives
カテゴリ別記事リスト
2月, 2010
11月, 2009
9月, 2009
7月, 2009
6月, 2009
4月, 2009
3月, 2009
2月, 2009
1月, 2009
12月, 2008
11月, 2008
10月, 2008
9月, 2008
5月, 2008
3月, 2008
2月, 2008
1月, 2008
12月, 2007
Memo
» フリーWebテンプレート
» 携帯絵文字一覧
» 無料ロゴメーカー
Categories
Tags
エラー | Apache | CentOS5 | SEO | メールサーバ | CentOS | テンプレート | CentOS4 | MySQL | Google | AU | UTF-8 | 海外アプリ | 携帯 | Softbank | Postfix | 文字化け | PHP | Nucleus | HDD
New Comments
11/26 09:22:28
kennyqi
CPUの稼働率、 DBとWebサーバを分けたら落ち着きました^^;>>
11/05 02:37:46
kennyqi
この設定をしたら、サーバのCPU稼働率が100%になる時間が出...>>
08/10 11:46:27
kennyqi
2009年8月15日よりAmazonAPIは 電子署名による取得が必須と...>>
01/09 00:43:25
kennyqi
どうもありがとうございます。 写真はわけたほうがみやすい...>>
01/09 00:36:48
Motoo
早速旅行記おめでとうございます。 ただ、画像がおおきすぎ...>>
Archives
カテゴリ別記事リスト
2月, 2010
11月, 2009
9月, 2009
7月, 2009
6月, 2009
4月, 2009
3月, 2009
2月, 2009
1月, 2009
12月, 2008
11月, 2008
10月, 2008
9月, 2008
5月, 2008
3月, 2008
2月, 2008
1月, 2008
12月, 2007
Memo
» フリーWebテンプレート
» 携帯絵文字一覧
» 無料ロゴメーカー