はじめまして。ROM ONLYの年寄です。
どこにカキコめばわからないので、ここに書かせていただきます。
当方、趣味でDB作成、Delphi Programmingを楽しんでおります。
Delphi2007を使ってソフトを作成中ですが今回はDelphiとは関係ありません。
(今のところ最新版DelphiへのUPDATEはいつのことになるやら…です)
DEKOさんのIBConsoleにはansi版の初期の頃からありがたく使わせていただいています。
環境は
OS:Windows10
DB:Firebird2.5(64bit)Diarect 3, character set UTF8
IBConsole:ibc_unicode_rel29_win64(発見時)rel50_win64(現在)です。
今までは、文字列にはVarchar/BLOBを使ってきたのですが、今回初めてField定義に
複数のCharフィールドを使いました。
(それぞれ最大文字数および大多数のデータが最大文字数であることがわかっていたので)
IBConsoleのオブジェクトインスペクタでテストデータを確認中、下記の如きおかしな現象に出くわしました。
文字列に、Char(n) character set utf8フィールドを定義したテーブルの場合、
IBConsoleのオブジェクトインスペクタのデータタブ画面(データグリッド)で
・Charフィールドのデータが漢字、かな等のマルチバイト文字の場合データ文字列の後ろにゴミ文字列が現れます。
(他の数値フィールド、Varcharフィールドの表示には問題なし)
・ゴミ付きのままだとCharフィールド以外のフィールドも編集後の他行への移動、COMMITが不可です。
”長さ12の文字列を容量8のフィールドに格納しようとしています。”のメッセージが表示される。
(メッセージ内の数値は例で、データ長>定義フィールド長とメッセージされます)
・INTフィールドを編集する場合でも、同時にCharフィールド(複数フィールドあれば全て)のゴミを除く処理をしないと
他行への移動が不可です。移動後COMMITすれば、またゴミが表示されます。
・データグリッドの空白行へのデータ書き込みは可能ですが、COMMITして再表示すると同様にゴミが付きます。
・UTF8で定義していてもすべての全CharフィールドのデータがASCII文字の場合は表示上、ゴミは現れませんし、
Char以外のフィールドの編集、移動、COMMITが可能です。
オブジェクトインスペクタのプロパティ画面からChar→Varcharに変更するとデータタブ画面での
表示のゴミが消え、データ編集、COMMITが問題なく実行できるようになります。
インタラクティブSQLを使ってのINSERT/UPDATE文は問題なく実行できますが、
SELECT文を投げて表示されるデータグリッドにも同様にCharフィールドではデータの後ろにゴミが付きます。
私の実力では、データグリッドは
編集時の文字列エリアのハイライト長からChar定義文字数の4倍のByte長を確保している。
Charフィールドへの入力時は、全角・半角の混在時でも文字数をきちんとカウントしている。
ぐらいしかわかりません。
なお、
FirebirdのISQLを使ったSELECTではゴミはついていませんでした
ansi版のIBCOSLEはまだ試していません。
一度、確認していただけないでしょうか。
|