上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
会社で開発用に使っているマシンと、社内webアプリが動いているサーバのMySQLを4系から5.0.20へバージョンアップしました。

しかし、MySQLのバージョンアップ作業はしんどいです。嫌な思い出しかありません。私の場合ですが、マルチバイト文字、日本語絡みのトラブルによくあいます。今回もその例に漏れず、バージョンアップ作業中に引っかかった部分があるので、忘れないようにメモしておきます。

環境はwin2kSP4+apache2+PHP5。使用している文字コードはUTF-8です。
1.旧バージョンのMySQLサービスは削除しておく
これをしておかないと、新しいバージョンのMySQLサービスが立ち上がらず、インストールに失敗します。

どうやらwin2kでは標準でサービスを削除する機能が無いらしく、リソースキットDelsrv.exeが必要になります。

後はコマンドラインから"delsrv.exe mysql"で旧バージョンのMySQLサービスが削除されます。

2.ODBCでAccessからMySQLに接続すると日本語が化ける

データベース・サーバのフロントエンドとしてAccessを利用する


という事なんですが、日本語が化けました。

これは、MyODBCの設定で、Initial Statementにset character set utf8と指定してやる事で解決。ちなみにMySQLの一部のバージョンではこの設定を行うとODBC接続ができなくなります。旧バージョンがちょうどこのバージョンに当たっていたらしく、苦しんだ記憶があります。

3.webアプリの日本語が化ける
phpMyAdminからアクセスすると日本語がちゃんと表示され、一安心して自作の社内webアプリを開くと見事に日本語が化けていました。これはしんどい。

4.1以上の壁 (日本語の扱いの違い、文字化け等/含む5.0以上)


これらの問題を避けるには、方法は3つ。

* 5.0.13-rc 以上の場合は、mysqld --skip-character-set-client-handshake オプションを必ず指定する
* PHP(Ruby,Perl,C,...)のアプリの変更。サーバーに接続した後にすぐ、"SET NAMES キャラクターセット名" という SQL 文を実行する
* PHP(Ruby,Perl,C,...)の MySQL モジュールの標準キャラクターセットを、自分が使うキャラクターセットにする。これはアプリの変更はない。しかし、libmysql.dll, libmysqlclient のコンパイルし直しが発生する。
ただし、サーバーもクライアントライブラリーも5.0.13-rc 以上の場合、skip-character-set-client-handshake オプションが mysqld に指定されていれば、この作業は不要。


原因がとても分かりやすく説明されています。
my.iniでskip-character-set-client-handshakeオプションを指定する事で解決。


MySQLでの日本語処理全般に関しては、MySQL日本語の旅が良くまとまっています。ボリュームが結構ありますが。

ちなみに昨日からこれに悩まされています。
コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
copyright © 2005 The elephant vanishes all rights reserved.
Powered by FC2ブログ.
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。