8

Firebird 2.5 にデータが入ったデータベースがあります。UTF-8文字セットをからに変更する必要がありますISO8859_1

alter database default character set ISO8859_1 collation ES_ES

しかし、うまくいきません。文字セットを変換するにはどうすればよいですか?

4

2 に答える 2

15

デフォルトの文字セットを変更すると、変更後に (明示的な文字セットなしで)作成された列にのみ影響します。文字セットは個々の列のプロパティであるため、既存の列は影響を受けません。これは、すべての (関連する) 列を変更する必要があることを意味します。

いくつかの問題があります

  1. Firebird は変更時にデータを変更しませんが、代わりに新しい形式バージョンを作成し、選択時に古い形式から新しい形式にオンザフライで変換します。
    これはパフォーマンスに影響しますが、実行時に文字列変換エラーが発生する可能性もあります (たとえば、UTF-8 文字が ISO-8859-1 に存在しないため)。
  2. 文字セットの変更は、列が現在実際の文字セット (NONEまたは以外OCTETS) を持っている場合にのみ正しく機能します。別の文字セットからの変換、NONEまたはOCTETS別の文字セットへの変換は、文字列変換エラー、またはコンテンツが期待と一致しないためにガベージが発生するか、ターゲット文字セットの無効なバイトになる可能性があります。
  3. 一部のバージョン (iirc) では、実際には文字セットがまったく変更されません。

これらの問題に対処するには、次のことができます。

  1. データベースの DDL をエクスポートし、文字セット定義を変更し、新しいデータベースを作成し、データ ポンプ ツール (FBCopy など) を使用して古いデータから新しいデータにデータをコピーします。
  2. または、変更する列ごとに次のようにします。
    • 新しい列を作成する
    • UPDATE table SET newcolumn = oldcolumn(または oldcolumn がNONEorの場合OCTETS:UPDATE table SET newcolumn = cast(cast(oldcolumn as VARCHAR(...) CHARACTER SET assumedcharset) as VARCHAR(...) CHARACTER SET targetcharset)
    • 古い列をドロップ
    • 新しい列の名前を変更します
    • その他の依存関係の問題 (インデックス、トリガー、外部キーなど) を修正します。

この 2 番目のオプションは、(テーブル、列、および依存関係に関して) 小さなデータベースを変更する場合、または奇妙な変換を実行する必要がある場合にのみ推奨されます。それ以外の場合は、データ ポンピング ソリューションを使用することを強くお勧めします。

于 2015-08-28T07:19:47.857 に答える
1
ALTER CHARACTER SET ISO8859_1
SET default COLLATION ES_ES;

変更したいアクティブなデータベースに対してこれをスクリプト実行してください!

于 2015-08-27T14:48:02.503 に答える