KennyQi PHP Blog

Linux、PHP、Perl、Ajax、MySQLでのWeb開発やWordPressの設定メモと息抜きブログ

  • 9月042009

    MySQLとPHPの連携:: set names utf8以外の文字化け対策

    Published on 2009/09/04 19:09 7,003
    カテゴリ: Linux, MySQL, PHP; タグ: ,

    MySQL5.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を利用すれば、このような不整合が発生しないので問題も発生しなくなります。

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

    このページはどうでしたか?
    よくないよい
    よかった:+4 人(4 人中)
    No Comments
  • 初めて当ブログに訪れた方や何度か当ブログにお越し頂いている皆様。
    もしブログの内容を気に入って頂けましたらRSSリーダーの登録よろしくお願いします。

コメント


ブログランキング

にほんブログ村 IT技術ブログへ 人気ブログランキングへ

最新記事

カテゴリー

人気記事