3

UIB を使用して Firebird 2.5 データベースに接続する、Delphi 2010 で構築されたアプリケーションに取り組んでいます。アプリケーションは長い間デフォルトの文字セットを使用して実行されてきました。つまり、誰も文字セットに特別な考えを与えず、単に機能していました。現在、UTF-8 データで正しく動作するようにしようとしています。

そうすることで、TUIBQuery とパラメーター化されたクエリで問題が発生しました。Database.Charset=csUTF8CHAR(n) フィールドのパラメーター値を使用および設定し、クエリを実行する前にそれを取得すると、値が切り捨てられます。

残念ながら、私のコードのいくつかは、このようなパラメーターをさまざまな場所で読み書きするため、醜い死を迎えます。

問題を切り分けて実証するために、DEFAULT CHARACTER SET UTF-8次のようなテーブルを使用して単純な新しいデータベースを作成しました。

  CREATE TABLE TEST (
    CHARFIELD CHAR(20),
    VARCHARFIELD VARCHAR(20)
  );

TUIBDatabase と TUIBTransaction を使用してデータベースに接続するようにアプリケーションをセットアップしました。次に、TUIBQuery インスタンスを作成し、SQL をこのテーブルへのパラメーター化された INSERT ステートメントに設定し、パラメーターを設定します。

  Query := TUIBQuery.Create(NIL);
  Query.Transaction := Transaction;
  Query.SQL.Text := 'INSERT INTO TEST (CHARFIELD, VARCHARFIELD) VALUES (:CHARFIELD, :VARCHARFIELD)';
  Query.Prepare(True);

  s:= 'ABC';

  Query.Params.ByNameAsString['CHARFIELD'] := s;
  Query.Params.ByNameAsString['VARCHARFIELD'] := s;

パラメータ値を次のように読み戻すと、次のようになります。

  s := Query.Params.ByNameAsString['CHARFIELD'];
  s := Query.Params.ByNameAsString['VARCHARFIELD'];

の結果は正しいですDatabase.Charset=csNone。しかし、代わりDataBase.Charset=csUTF8にCHARFIELDの値を指定すると、の'A'代わりに切り捨てられ'ABC'ます。VARCHARFIELD の値は問題ありません。この動作は実際のデータとは無関係です。サンプルが示すように、実際に非 ASCII 文字を使用してそれを誘発する必要はありません。

クエリでの ExecSQL() の呼び出しは正しく機能し、どちらの場合も期待どおりにデータを挿入します。

ソースコードをUIB_UTF8_Test.zipとして簡単なテスト プログラムにアップロードしました。

ここの誰かが、私が間違っている可能性があることと、それを正しく行う方法を知っていますか?

4

0 に答える 0