Open Source WEB

今まで、プログラムにゴチャゴチャと手を入れてきたが、 その作業の本質は何だったかを考えてみよう。

手を入れた例として、 フィールド毎にキャラクタセットを反映できたの先頭で、以下のように 変更したのを載せておいた。

  2231        {
  2232          const char* charsn = get_charset_name(field->charsetnr);
  2233          CHARSET_INFO *charset_info= get_charset_by_name(charsn, MYF(MY_WME));
  2234
  2235          uint currlength= (uint) lengths[off];
  2236          uint numcells= charset_info->cset->numcells(charset_info,
  2237                                              str, str + currlength);
  2238          tee_fprintf(PAGER, num_flag[off] ? "%*s |" : " %-*s|",
  2239                      maxlength + currlength - numcells, str);
  2240        }

これは、カラム毎にループするところで、 キャラクタセットをカラム毎に面倒な方法で取得している。 文字列の幅を求める関数 numcells() を呼び出そうとしているだけなのだが、 この関数は、各キャラクタセット構造体からリンクされている。 そのために、それより前の2232,2233行で、毎回キャラクタセット情報を 求めている。これは面倒だし、余分な負荷でもある。

そもそも、サーバがクライアントに対してどういうキャラクタセットで送るかは サーバ側で管理されているのであり、 そのためにクライアントそれぞれ、というかセッション毎に、 各機能に応じて使われるキャラクタセットを記憶しておくシステム変数が 用意されている。

だから、このシステム変数の値(キャラクタセット)を クライアントが取得すれば済むのである。


5.1 でmysqlプロトコルのキャラクタセット関連のプロトコルが追加かも

昨日、SET NAMES はメタデータでは無効で取りあげた、 日本MySQLユーザ会のメーリングリストの mysql:12598 の 後半に、以下の問題が書かれていた。

"SET NAMES ..." あるいは "SET character_set_client ..." でサーバ変数の 値が変更されるが、mysqlclientには反映されない。

クライアントから、クライアントの受け取るキャラクタセットを指定する ための司令が出されるにも拘らず、現状ではクライアントは自分はどの キャラクタセットの文字を受け取るのか知らないのである。

これは、クライアントが cp932 でデータを受け取りたいとサーバに要求し、 サーバは cp932 で送って来るにもかかわらず、 クライアント自身は送られて来たデータのキャラクタセットが何かを 知らないという、とても馬鹿な作りなのである。

これを何とかするために、面倒なプログラムになっていたのである。

解決するには、サーバがクライアントに送って来る文字列のキャラクタセットを、 クライアントがいつでも知ることができる方法を提供しなければならない。

クライアントが、入力される "SET NAMES ..." あるいは "SET character_set_client ..." を解析して記憶すると言う手段はあるものの、 これは明らかに繁雑である。

それに、これは、mysqlクライアントコマンドだけではなく、 mysqlのあらゆるクライアントで、同様の問題が発生するので、 クライアントはいつでも自分が受け取る文字列のキャラクタセットを 知る方法が存在しなければ良くない。 それに、サーバとクライアントの間で、互いにどのキャラクタセットで 文字列データを受け渡しするかを確実に把握しておかないと、 それこそ文字化けの原因になってしまう。

だから、サーバ側でキャラクタセットを一元管理し、クライアントは 必要に応じていつでもどのキャラクタセットが使われているのかを知る 手段があった方が良い。

ということで、mysqlのプログラムを改変し、キャラクタセットが何かを 調べることができるようにする、という案が出ている。 ただし、これを実現するには、当然プロトコルが変更になる. 5.0のプロトコルはもう確定しているので、

5.1にてmysqlのクライアントプロトコルの改変があるかも

ということがメールに書かれていた。

ここでは、mysqlclientコマンドについてのみ考察しているが、 mysqlのクライアント一般、とくにmysqlのツール等を作ろうという場合には、 このようにプロトコルを拡張してくれると、 文字列に関する処理がとてもやりやすくなることは間違いない。

2006年中に変更はされようが、5.1の製品版リリースとなると、 まだかなり先ではないかと思う。


戻る:タイトル部分も揃えてしまおう

次へ:データベースの作成、確認、削除


フィードバック:

Name:
Comment:

There is no comment.

このサイトは、 IPA の「平成15年度オープンソフトウエア活用基盤整備事業」 の委託事業として開発されたKahuaで試験的に運用しております。

Copyright (c) 2004-2007 株式会社タイムインターメディア About Us