Team Japan

dbExpress4のServerCharSetプロパティ

高橋(智)です。
RAD Studio 2007 には、Unicodeに対応したdbExpressドライバと、TWideStringFieldに対応したデータセットが搭載されています。(※BDS2006では、dbGO(ADO)だけがUnicodeに対応していました)
しかし、MySQLやInterBaseなどに接続する際に、今回紹介する「ServerCharSetプロパティ」を「TSQLConnectionのParamsプロパティ」に明示的に追加する必要があります。この「ServerCharSetプロパティ」はオンラインマニュアルには詳しい記載はありませんが、ドライバの設定情報が収められている「C:\Users\Public\Documents\RAD Studio\dbExpress\dbxdrivers.ini」や「C:\Documnents and Settings\All Users\Documents\RAD Studio\dbExpress\dbxdrivers.ini」には記載されています。
たとえば、MySQL5.0.xのutf8テーブルにアクセスする場合は、予め[エディタ(C)...]ボタンをクリックして、「ServerCharSet=utf8」というパラメータを追加する必要があります。

MySQL-UTF8
その他、InterBaseのUnicodeテーブルにアクセスする場合は、やはり予め[エディタ(C)...]ボタンをクリックして、「ServerCharSet=UTF8」または「ServerCharSet=UNICODE_FSS」 というパラメータを追加する必要があります。

InterBase-UTF8

この後、データセットにフィールドを追加すると型として「TWideStringField」が認識されるようになります。

TWideStringField

Posted by Tomohiro Takahashi on February 26th, 2008 under C++, Database, Delphi, Non Tech |



5 Responses to “dbExpress4のServerCharSetプロパティ”

  1. 勉 山田 Says:

    dbExpress4のServerCharSetプロパティ について

     BDEから変更しなければならないので、
     推奨されている Blackfishを使おうとしています。

     ところが、
    TClientDataSetのFilterで、
    例えば、
    KUBUN=’一般男子’

    と漢字を使用すると、該当データがあるにもかかわらず、何も表示されなくなります。

     フィルターを、例えば、
    KUBUN=123
    と漢字を使用しない場合にはフィルターが効きます。

     このTClientDataSetのフィルターに漢字が使えないという現象は、この「dbExpress4のServerCharSetプロパティ」の問題と同じ問題なのでしょうか。

     しかし、TSQLConnectionのParamsプロパティに次のいずれを追加しても効果ありません。

    ServerCharSet=UTF8
    ServerCharSet=UNICODE_FSS
    ServerCharSet=SJIS_0208

     また、これらの設定をしてClientDataSetの OnFilterRecord に次のように記入しても、全データが表示され、フィルターの効果は出ませんでした。

    procedure TProtform.ClientDataSet1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
    begin
     Accept := DataSet['KUBUN'].AsString = ‘一般男子’;
    end;

     接続は次のようにつなげています。

    TSQLConnection->TSQLDataSet->TDatasetProvider->TClientDataSet->TDataSorce->TDBGrid

     もし、データベースのフィルターで漢字が使えないのであれば、
     日本では使い物にならないことになります。

     Blackfishについては本も出ていませんから、メーカーである御社の情報のみが頼みということになります。

     しかし、この問題についてマニュアルにも書いてありません。
     高橋(智)さんも[「ServerCharSetプロパティ」はオンラインマニュアルには詳しい記載はありませんが・・]と書かれています。
    http://blogs.codegear.com/teamj/2008/02/26/118/
     
     情報がなければ Blackfish を使う人はそれほど増えないことになります。
     事実、ブログでBlackfishを使うことをあきらめたという記事も出ています。
     Blackfishを使っている人はいない、と書いているブログもあります。
     
     メーカーとしてはBDEの代わりとして推奨しているBlackfishについて、利用できるように、Filterが使えるように、十分にマニュアルで説明しておく必要があるのではないでしょうか。

     このような「御社のソフトで説明不足の場合」にも、サポート契約とインシデントを要求するのでしょうか?

     このメールでは回答は帰ってこないのでしょうか。

     なお、DelphiはDelphi3から使用しており(正規ユーザー)、BDEを利用したソフトは数多く作成して、Filterも使用しています。この問題についてDelphi2009で作成中。

     ご返事か解説を期待しています。
     

  2. Tomohiro Takahashi Says:

    TClientDataSetのFilterについては、古くは Delphi 7 の頃から問題を抱えています。現時点でQualityCentralにはQC#67792,QC#67485,QC#66622,QC#66618,QC#10828,QC#6740,QC#4790と言った報告が登録されています。

    ClientDataSetの OnFilterRecord についてはちょっと分かりません。

  3. Tomohiro Takahashi Says:

    > このメールでは回答は帰ってこないのでしょうか。
    可能であれば、インフォメーションセンターまたはテクニカルサポートにコンタクトしていただけますようお願いいたします。

  4. Tomhiro Takahashi Says:

    Blackfish(.NET版およびJava版)については、サーバ側では文字列データをUnicode(16bit単位)で管理しますので、ServerCharSetプロパティによる指定は不要です。

  5. Tomohiro Takahashi Says:

    Delphi 2009 と Blackfish で試してみましたが、以下のようなコードで特に問題なくフィルタリングが可能でした。
    —————-
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    ClientDataSet1.Filter := ”;
    ClientDataSet1.Filtered := True;
    ClientDataSet1.Active := True;
    end;

    procedure TForm1.ClientDataSet1FilterRecord(
    DataSet: TDataSet; var Accept: Boolean);
    begin
    if DataSet.FieldByName(’DATA’).AsString = ‘かきくけこ’ then
    Accept := True
    else
    Accept := False;
    end;
    —————-

Leave a Comment



Server Response from: blog2.codegear.com