Chat (Lingr.com)
Informaiton
Daily
Column
- MySQL日本語の旅(5/1)
- アクセス向上秘伝(5/9)
- 一風変ったHaskellλ門(6/13)
- SICP Answer Book (5/31) 問題3.26追加
Zope Solution
Extra
アーカイブ
OSS案内所
Site Info
関連リンク
今まで、プログラムにゴチャゴチャと手を入れてきたが、 その作業の本質は何だったかを考えてみよう。
手を入れた例として、 フィールド毎にキャラクタセットを反映できたの先頭で、以下のように 変更したのを載せておいた。
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の製品版リリースとなると、 まだかなり先ではないかと思う。
フィードバック:
There is no comment.