【コラム】

Yet Another 仕事のツール

48 MySQL 4.0から4.1へのアップグレード 、トラブってませんか?

    鶴田展之  [2004/12/21]

    先々週から茶筌を使った形態素解析について書いてきたが、最近MySQL周辺でバージョン4.1のプロダクション・リリースに伴ったちょっとした混乱が生じている様子なので、今回は少し寄り道をして情報を整理しておきたい。

    MySQL 4.1では、特に我々日本人にとって影響の大きい文字エンコーディング周りにも、かなり大幅な改変が入っている。文字コードの自動変換機能が追加されたり、UTF-8、UCS2といったUnicodeのキャラクタセットが利用可能になったり、データベース単位にしか指定できなかったキャラクタセットが列単位に指定できるようになったりと、とにかく盛りだくさんである。機能が増えるのは一般的には喜ばしいことだが、既存のMySQL 4.0からアップグレードしようとするユーザにとっては、当然のことながら互換性が心配のタネになる。そして、現状ではトラブルがないとは言えない状況のようだ。

    まず、サーバが4.1にアップグレードされた場合、4.0以前のクライアントから接続しようとすると、以下のようなメッセージが表示されて接続を拒否される。

    Client does not support authentication protocol requested
    by server; consider upgrading MySQL client

    これは、パスワードのハッシュが、セキュリティを高めるために16バイト長から41バイト長に変更されたためだ。接続する全てのクライアントを4.1にアップグレードすれば問題は解決するが、それが難しい場合は、暫定的に16バイト長のパスワードハッシュで運用を継続することになる。サーバを「--old-passwords」オプション付きで起動することで、PASSWORD()関数によって生成されるパスワードは16バイト長のままになるので、my.cnf設定ファイルに以下の設定を記述しておくとよいだろう。

    [mysqld]
    old-passwords

    また、4.0のデータベースを4.1に移行する場合、ユーザ情報を管理するテーブルのパスワード列の長さを変更しておく必要がある。MySQL 4.1には、この作業のための「mysql_fix_privilege_tables」スクリプトが付属するので、これを実行すればOKだ。

    また、4.0までは正しく返されていた文字が「?」になってしまったり、クエリの結果自体が正しくないといった問題が起きることもある。これは、「クライアントとサーバのキャラクタセットが異なる場合、自動的に変換する」という文字コード自動変換機能に起因している場合が多い。現在、MySQL ABから提供されているMySQL 4.1のバイナリは、デフォルトのキャラクタセットが「Latin1」でビルドされている。例えば「--default-character-set=ujis」のクライアントからLatin1のサーバに接続した場合、やりとりされるデータはEUCとLatin1の間で勝手に変換がかかってしまう。EUCで表現された文字は、当然Latin1の文字セットには無いので、「?」にされてしまうわけだ。また、クエリの結果が正しくないのは、char(n)型のn、つまりフィールド長の基準がバイト数から文字数に変更になったことも影響している。

    対策としては、MySQL ABが配布しているバイナリを使用せず、自分で「--with-charset=binary」ビルドオプションを付加してソースコードからビルドするのがお勧めだ。LinuxではMySQLのソースツリーで

    # ./configure --with-charset=binary
    # make
    # make install

    これはデフォルトのキャラクタセットをbinaryに設定することで、自動変換機能による余計なお節介を抑制するためだ。その上で、PHPなど、MySQLのクライアントとして動作するソフトウェアも、全てMySQL 4.1のクライアントライブラリを使ってリビルドする。これでサーバ側のキャラクタセットをmy.cnfに指定して起動すれば、多くの問題は避けられる。

    また、既存のデータベースのアップグレード時は、各テーブルのchar()フィールドを「ALTER TABLE」で再定義する必要がある。日本MySQLユーザ会MyNAから、このための便利なシェルスクリプトが提供されているので、これを利用すると便利だろう。MyNAのサイトには他にも、PHP4に対するパッチなどありがたいリソースが用意されている。

    現在、MyNAが中心となって、日本人がより普通の感覚で使えるようなバイナリを提供してくれるよう、MySQL ABへの働きかけが積極的に行われている。実際、最新のMySQL 4.1.8では、それ以前に出ていた「"(株)"など一部の文字がテーブルに格納できない」といった問題が改善されているが、これは日本のユーザからのレポートやパッチの提供などが大きく貢献している。また、今回本稿を執筆するにあたって大いに参考にさせて頂いたMyNAのFAQ>には、ここで述べた以外にも気を付けておいた方が良い事柄について解説がある。MySQL 4.1にアップグレードする前に目を通すことを強くお勧めする。

    早いもので、当コラムも今回が本年最後となる。読者の皆様が素晴らしいクリスマス、そして新年を迎えられますように。

    新着記事

    特設サイトの情報

      人気記事

      一覧

        イチオシ記事

        新着記事

        特別企画

        マイナビニュースマガジン