4

現在、データベースは Win1252 を唯一の文字エンコーディングとして使用しています。まもなく、データベース テーブルで Unicode をサポートする必要があります。つまり、4 つのデータベースと、24 時間年中無休の環境で社内で実行される約 80 の Delphi アプリケーションに対して、この移行を実行する必要があります。Delphi アプリケーションのデータベースを UTF-8 (または UNICODE_FSS) に移行するための推奨事項はありますか? 以下にいくつかの質問を示します。ご回答ありがとうございます。

  • データをダンプし、UNICODE_FSS または UTF-8 でデータベースを再作成し、データをロードすることによって、既存のデータベース (250 MB から 2 GB の間のサイズ、Blob フィールドなし) の移行を支援するツールはありますか?
  • Unicode 文字セットに関連する Delphi 2009、dbExpress、および Interbase 7.5 に関する既知の問題はありますか?
  • 最初にデータベースをInterbase 2009にアップグレードすることをお勧めしますか? (このアップグレードは計画されていますが、優先度は高くありません)
  • データベースを移行するだけで、Delphi は Unicode 文字セットを自動的に処理しますか、それともすべてのデータ モジュール (dfm とソース コード)のすべての文字フィールド タイプも変更する必要がありますか?
  • 既存のアプリケーションの通常の開発および保守と並行して移行に取り組む場合、どの戦略をお勧めしますか? アプリケーションは社内で実行されるため、開発とデータベース管理は社内で行われます。

更新: InterBase ディスカッション フォーラム スレッドから: InterBaseの Unicode データベース - 本当に? (これは私によるスレッドではありませんが、InterBase XE にまだいくつかの問題が存在することを示しています)。

私が提出したいくつかのレポートは次のとおりです。 QC#92867 - ビューにユニオンが含まれている場合、および ClientDataSet を使用している場合にのみ、ビューからの文字列フィールドが空白になります。これは、いくつかのレポートで欠落しているデータとして見つかり、機能しなくなりました。

QC#91494 - IB 文字列データ 文字フィールド (例: Char(1)) は、ストアド プロシージャを介して取得されると空白で埋められます。テストは失敗します - 例: If Active = "Y". フォームでストアド プロシージャを多用していますが、これらは機能しません。

QC#91355 - IBSqlMonitor が失敗する。IBSqlMonitor の出力は多少文字化けしているため、このツールは役に立ちません。(だから、私のシャベルも壊れている!)

未報告 - TClientDataSet の永続フィールドが TWideString で失敗します。

その他の関連する QC エントリ:

QC#94455 SQL Unicode Char タイプの失敗 (InterBase XE)

4

8 に答える 8

1

DatabaseWorkbenchIBExpertの両方がデータ移行を実行できます。

Entwickler Tageにいるときに、他の質問についてお返しします。

--jeroen

于 2010-02-21T18:31:10.163 に答える
1

問題: 空の文字列フィールドに対する UPDATE でレコードが見つからなくなりました。UTF8 文字フィールドが空の場合、DataSetProvider は更新アクションに対して間違った SELECT を生成します。

症状: メッセージ「レコードが見つからないか、別のユーザーによって編集されていません」

解決策: Delphi 2010 Update 4 にアップグレードするか、QC に記載されている回避策を使用してください。

于 2010-05-18T12:57:28.213 に答える
0

問題:WIN1252データベースのメタデータとテーブルデータをエクスポートすると、CP1252でエンコードされたファイルが作成されますが、インポートにはUTF8ファイルが必要です(IBExpertでテスト済み)

症状:InterBaseへのスクリプトインポートのエラー

解決策:iconvを使用してスクリプトファイルをUTF8に変換します

于 2010-05-19T13:50:30.450 に答える
0

問題: CHAR フィールドが機能しなくなり、VARCHAR に置き換える必要があります。

以前の動作: UTF8 を使用し、ASCII 値で WIN1252 からインポートされた列に対する SELECT クエリは、値を返さなくなりました。たぶん、これは QC で報告すべきバグです。

解決策CHAR(:データベース メタデータ DDL スクリプト内のすべての出現箇所を次のものに置き換えます。VARCHAR(

于 2010-05-18T12:54:40.997 に答える
0

問題: 文字列パラメーターを持つ UDF (ユーザー定義関数) は、サイズの制限により破損する可能性があります。

症状:

Dynamic SQL Error.
SQL error code = -204.
Data type unknown.
Implementation limit exceeded.
COLUMN DSQL internal.

この UDF の場合:

DECLARE EXTERNAL FUNCTION STRLEN
    CSTRING(32767)
    RETURNS INTEGER BY VALUE
    ENTRY_POINT 'IB_UDF_strlen' MODULE_NAME 'ib_udf';

解決策: 宣言の UDF パラメータを修正します。

于 2010-05-19T13:22:51.633 に答える
0

問題: dbExpress は内部でデータ型として WideString を使用するため、フィールドとパラメーターの読み取り/設定のための既存のすべての.AsString呼び出しが機能しなくなります

症状: 特殊文字が正しく保存/読み取られない

解決策: 出現する .AsString をすべて .AsWideString に置き換えますが、フィールドまたはパラメーターで AsString メソッドが呼び出されない場所を変更しないように注意してください。

于 2010-05-19T13:42:35.317 に答える
0

問題: dbExpress には WIN1252 フィールド用の TStringField オブジェクトが必要です。UTF8 データベース フィールドの場合、dbExpress には TWideStringField オブジェクトが必要です。

症状: エラー メッセージ 'expected: WideString found: string'

解決策: TStringField をすべて TWideStringField に置き換えます。これには、すべてのフォーム ファイル (dfm) がバイナリではなくテキストである必要があります。変更されたフォームとデータモジュールには下位互換性がありません。

于 2010-05-19T13:45:56.857 に答える
0

問題: 永続的な文字列フィールドには、フィールドの論理サイズの 4 倍である Size プロパティが必要です (「TStringField を微調整して、Delphi の TWideStringField のように機能させることは可能ですか? 」も参照してください) 。

症状: アクセス違反

解決策: 永続フィールドを削除して再度追加し、Size プロパティを更新します。(副作用: DisplayWidth もサイズが大きくなり、UI に問題が発生します)

于 2010-05-18T12:59:46.973 に答える