XREAにUTF8設置時の文字化け: 3)解決編
XREA s201 サーバに、WordPress ME 2.0.2 をUTF-8で設置しようとすると文字化けする件についてのまとめ、その3。
本件の現象は、MySQL 5.0 の「文字コード自動変換機能」と修正オプション mysqld --skip-character-set-client-handshake の影響ではないか? その確認・テスト。
本件記事 INDEX
「1) 現象」から順に読んである前提で書いています。
- 現象 : サーバ環境・現象
- 試行錯誤編
- 解決編 : MySQL の文字コードと s201 の状態 (本記事)
- 設置方法まとめ : 自動広告挿入による障害対応含む
- 追加情報 : その後の動作状況(バックアップ等)、XREA 仕様変更等
目次:
参考サイトさま
感謝の気持ちを込めて。
- 日本MySQLユーザ会 (MyNA)
- ぱんぴーまっしぐら » PHPとMySQLの個人的まとめ
- Memo » XREA.COM に MovableType を設置してみた。
- iandeth. » Movable Type + MySQL 4.1 を組み合わせると日本語が文字化けする不具合/障害の解決方法
- iandeth. » MySQL 4.1 日本語環境設定方法 (キャラクタセット設定方法)
- WordPress Japan フォーラム » 文字化けします
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_ciDB を一旦削除してから作成し直すと上のようになったが、削除せずに「作成」で初期化した場合は、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 } 5657 mysql_query("SET NAMES utf8", $this->dbh);58 $this->select($dbname); 59 }
WP ME 2.0.2 インストール
- 上記修正済み WP のディレクトリに書き込み権限
- WP ME 2.0.2 インストール: 文字コードは UTF-8 を選択
- インストールが正常終了したら、WP のディレクトリをセーフティパーミッションに戻す
- WP のページにて、文字化け有無を確認
やたー!化けてないよーう!(^▽^) - 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 バイト - 格納データ: 文字化けしてない!
- DBの状態:
未確認事項
.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…



XREAでの設置で文字化けする at orioa :
June 17th, 2006 at 20:58
[...] 参考元は、以下 power source* » XREAにUTF8設置時の文字化け: 3)解決編 [...]
Odysseygate.com :
January 23rd, 2007 at 2:09
WordPressサーバ移転まとめ…
Table of Contents WP引越しの手引き
DBのエクスポート
wp_optionsの修正
DBのインポート
ドメインの設定
ありがとうロリポ!こんにち (more…)
MacFeeling :
January 24th, 2007 at 12:26
WordPressの文字化け…
データベースが作成されるまでの間に、WordPress以外のコンテンツのアップ。新しいサーバではss1がss2に変わったのを知らずにちょっとトラブルがあったものの、何と (more…)