【至急・重要】ウィルスチェックのお願い

Change Style


XREAにUTF8設置時の文字化け: 3)解決編

XREA s201 サーバに、WordPress ME 2.0.2 をUTF-8で設置しようとすると文字化けする件についてのまとめ、その3。
本件の現象は、MySQL 5.0 の「文字コード自動変換機能」と修正オプション mysqld --skip-character-set-client-handshake の影響ではないか? その確認・テスト。

本件記事 INDEX

「1) 現象」から順に読んである前提で書いています。

  1. 現象 : サーバ環境・現象
  2. 試行錯誤編
  3. 解決編 : MySQL の文字コードと s201 の状態 (本記事)
  4. 設置方法まとめ : 自動広告挿入による障害対応含む
  5. 追加情報 : その後の動作状況(バックアップ等)、XREA 仕様変更等

参考サイトさま

感謝の気持ちを込めて。

MySQL の文字コード

MySQL5では、文字コード自動変換がありますが、この機能が原因で文字化けするバグがありましたので、用意された修正オプションで対応させていただいております。

このため、元々EUC(UJIS)で作成したデータベースを、ユーザー様でUTF8に変換されて利用されていた、もしくは、両テーブルが混在していたデータベースで、クライアントキャラクタセットがデータベースと一致していなかった場合、文字化けが発生している模様です。

管理画面から、UNICODE(UTF8)で作成できるようにさせていただいておりますので、今後UTF8で利用される場合は、管理画面から申請を行ってください。

XREAサポ板 » s202で文字化けしてしまったデータベースの復旧法

ここで言われている修正オプションとは、mysqld --skip-character-set-client-handshake だろうか。

MySQL4.1 以降には、サーバとクライアントのキャラクターセットが異なる場合に文字コードを自動変換する機能(クライアントが binary の場合は自動変換されない)があるが、5.0.13-rc 以上の場合、このオプションを指定すると、クライアントがサーバーのキャラクターセットに合せるそうなのだ。(詳細は上記「参考サイト」参照。)

XREA S201 サーバの MySQL キャラクターセット

では、s201 サーバはどうなっているのか。
ぱんぴーまっしぐら »PHPとMySQLの個人的まとめ」を参考にさせていただいて、キャラクターセットを確認してみる。

DB を UNICODE で作成した場合
  • phpMyAdmin にて DB の状態をチェック
    • トップページ
      MySQL - 5.0.18-standard
          * プロトコルバージョン: 10
          * サーバー: Localhost via UNIX socket
          * ユーザー: bono@localhost
          * MySQL の文字セット: UTF-8 Unicode (utf8)
          * MySQL 接続照合順序: utf8_general_ci 
      

      DB を一旦削除してから作成し直すと上のようになったが、削除せずに「作成」で初期化した場合は、MySQL 接続照合順序が utf8_unicode_ci になるかも。

    • データベース
      サーバー: localhost
       データベース 昇順       照合順序    テーブル    行       データ     インデックスサイズ       合計      オーバーヘッド
      bono    utf8_general_ci     0   0   0   バイト     0   バイト     0   バイト     0   バイト
      information_schema  utf8_general_ci     16  0   0   バイト     4.0     KB  4.0     KB  0   バイト
      test    utf8_general_ci     0   0   0   バイト     0   バイト     0   バイト     0   バイト
      合計: 3   ujis_japanese_ci    16  0   0   バイト     4.0     KB  4.0     KB  0   バイト
      
  • phpMyAdmin にてコマンドを実行: character_set_server 以外は utf8 だが…
    実行した SQL: SHOW VARIABLES LIKE 'char%';
    全文
    Variable_name   Value
    character_set_client    utf8
    character_set_connection    utf8
    character_set_database  utf8
    character_set_results   utf8
    character_set_server    ujis
    character_set_system    utf8
    character_sets_dir  /usr/local/mysql-standard-5.0.18-linux-i686-glibc2...
    
  • php スクリプトより実行: php 経由だと ujis に。
    character_set_client    ujis
    character_set_connection    ujis
    character_set_database  utf8
    character_set_results   ujis
    character_set_server    ujis
    character_set_system    utf8
    character_sets_dir  /usr/local/mysql-standard-5.0.18-linux-i686-glibc23/share/mysql/charsets/
    
  • php で DB 接続後に SET NAMES "utf8" を実行してからだと:
    character_set_client    utf8
    character_set_connection    utf8
    character_set_database  utf8
    character_set_results   utf8
    character_set_server    ujis
    character_set_system    utf8
    character_sets_dir  /usr/local/mysql-standard-5.0.18-linux-i686-glibc23/share/mysql/charsets/
    
  • キャラクタセットに影響されるシステム変数 COLLATION (文字ソート順ルール) の設定状態も確認
    • SET NAMES をせずに SHOW VARIABLES LIKE "%collation%"
      collation_connection    ujis_japanese_ci
      collation_database  utf8_general_ci
      collation_server    ujis_japanese_ci
      
    • SET NAMES "utf8" を実行してからだと
      collation_connection    utf8_general_ci
      collation_database  utf8_general_ci
      collation_server    ujis_japanese_ci
      

SET NAMES を実行すると、character_set_client, character_set_connection, character_set_results の値を変更できるが、もちろん character_set_server の値は変えられない。=サーバとクライアントが違う→自動変換、とはならないのだろうか?
mysqld --skip-character-set-client-handshake オプションを指定した時点で自動変換自体が止まるのか?
DBに接続してからならこれが優先されて自動変換されないのかな??
などと、理解しきれないながらも、WP インストールにトライ。

WP ME 2.0.2 の修正箇所

DB に接続した直後に SET NAMES utf8 を行うよう修正する。

cf. WordPress Japan フォーラム » 文字化けします

wp-includes/wp-db.php 57行目に次の1行を挿入。

mysql_query("SET NAMES utf8", $this->dbh);

42     function wpdb($dbuser, $dbpassword, $dbname, $dbhost) {
43         $this->dbh = @mysql_connect($dbhost, $dbuser, $dbpassword);
44         if (!$this->dbh) {
45             $this->bail("
46~53 中略
54 ");
55         }
56 
57         mysql_query("SET NAMES utf8", $this->dbh);
58         $this->select($dbname);
59     }

WP ME 2.0.2 インストール

  1. 上記修正済み WP のディレクトリに書き込み権限
  2. WP ME 2.0.2 インストール: 文字コードは UTF-8 を選択
  3. インストールが正常終了したら、WP のディレクトリをセーフティパーミッションに戻す
  4. WP のページにて、文字化け有無を確認
    やたー!化けてないよーう!(^▽^)
  5. phpMyAdmin にて DB の状態 & 格納データが文字化けしていないかをチェック
    • DBの状態:
        サーバー: localhost
      データベース
      データベース 昇順   照合順序    テーブル    行   データ     インデックスサイズ   合計  オーバーヘッド
      bono    utf8_general_ci     10  79  7.4     KB  41.0    KB  48.4    KB  0   バイト
      information_schema  utf8_general_ci     16  0   0   バイト     4.0     KB  4.0     KB  0   バイト
      test    utf8_general_ci     0   0   0   バイト     0   バイト     0   バイト     0   バイト
      合計: 3   ujis_japanese_ci    26  79  7.4     KB  45.0    KB  52.4    KB  0   バイト
      
        サーバー: localhost  -   データベース: bono
          テーブル    操作  レコード数Tip    フィールドタイプ    照合順序    サイズ     オーバーヘッド
          wp_categories   表示  構造  検索  追加  空にする    削除  1   MyISAM  utf8_general_ci     5.1 KB  -
          wp_comments     表示  構造  検索  追加  空にする    削除  1   MyISAM  utf8_general_ci     4.3 KB  -
          wp_linkcategories   表示  構造  検索  追加  空にする    削除  1   MyISAM  utf8_general_ci     2.1 KB  -
          wp_links    表示  構造  検索  追加  空にする    削除  7   MyISAM  utf8_general_ci     4.6 KB  -
          wp_options  表示  構造  検索  追加  空にする    削除  63  MyISAM  utf8_general_ci     12.4 KB     -
          wp_post2cat     表示  構造  検索  追加  空にする    削除  1   MyISAM  utf8_general_ci     3.0 KB  -
          wp_postmeta     表示  構造  検索  追加  空にする    削除  0   MyISAM  utf8_general_ci     1.0 KB  -
          wp_posts    表示  構造  検索  追加  空にする    削除  2   MyISAM  utf8_general_ci     5.8 KB  -
          wp_usermeta     表示  構造  検索  追加  空にする    削除  2   MyISAM  utf8_general_ci     7.1 KB  -
          wp_users    表示  構造  検索  追加  空にする    削除  1   MyISAM  utf8_general_ci     3.1 KB  -
          10テーブル  合計  79  MyISAM  utf8_general_ci     48.4 KB     0 バイト
      
    • 格納データ: 文字化けしてない!

未確認事項

  • .htaccess による mbstring.internal_encoding のオーバーライドは必要?してもしなくても表面的には文字化けしないのだけど、今は一応入れている。
  • SET NAMES を実行しても、当然ながら character_set_server の値を変えられないので、サーバとクライアントが違うことにならないの?DBに接続してからならこれが優先されて自動変換されないのか?――要勉強。
  • WP と phpMyAdmin 上は文字化けは見られないが、本当に DB に UTF-8 で格納されているのかどうか、その確認方法。
  • バックアップや phpMyAdmin からの操作(編集・エクスポート・インポート)に問題は生じないか?
  • php アプリを修正する以外の方法は?
    • binary — 文字化けはしないが、phpMyAdmin でデータの中身が見られない。修正も出来ないのでは?
    • ~/.my.cnf をユーザ側で定義 or 作成DBの文字コードに合わせて自動設定とか
    • --skip-character-set-client-handshake オプションを加える前は、UTF-8 で動かせていた人がいた様子だけど。。。
  • and more…

3 Responses to “XREAにUTF8設置時の文字化け: 3)解決編”

  1. XREAでの設置で文字化けする at orioa :

    [...] 参考元は、以下 power source* » XREAにUTF8設置時の文字化け: 3)解決編 [...]

  2. Odysseygate.com :

    WordPressサーバ移転まとめ…

    Table of Contents WP引越しの手引き

    DBのエクスポート
    wp_optionsの修正
    DBのインポート
    ドメインの設定

    ありがとうロリポ!こんにち (more…)

  3. MacFeeling :

    WordPressの文字化け…

    データベースが作成されるまでの間に、WordPress以外のコンテンツのアップ。新しいサーバではss1がss2に変わったのを知らずにちょっとトラブルがあったものの、何と (more…)

コメントをどうぞ