2

Oracle の場合、さまざまな文字エンコーディングが指定されたストレージ割り当てに関するマトリックス/表形式の情報はありますか。

例えば:

size_of_col_in(AL32UTF8) == 4 * size_of_col_in(WE8ISO8859P1)

その係数値 4 に興味があります

4

1 に答える 1

3

最大の変化だけに関心がある場合を除き、あなたの例は正しくありません。

AL32UTF8 は可変長文字セットです。一般的に言えば、US7ASCII 文字セットの文字はすべて 1 バイト、ヨーロッパの文字は一般に 2 バイト、さまざまなアジア言語の文字は 3 バイト、少数の非常にまれな文字は 4 バイトを必要とします。現実的には、実際の WE8ISO8859P1 データを AL32UTF8 に変換することについて話している場合、実際には、2 よりも 1 にはるかに近い 1 と 2 の間の変換係数が表示されます。すべての有効な WE8ISO8859P1 文字の Unicode マッピングを調べずにAL32UTF8 文字セットで 3 バイトまたは 4 バイトのストレージが必要であるとしたら、私は驚きます。

グローバリゼーション サポート ガイドには、どの文字セットがシングルバイトで、どれがマルチバイトで、どのマルチバイト文字セットが固定幅であるかを示す文字セットに関するセクションがあります。ほとんどすべてのマルチバイト文字セットは可変幅であるため、探している要素はデータによって異なります。

ほとんどの場合、とにかくバイト長セマンティクスではなく文字長セマンティクスを使用するように列を宣言して、データベースがバックグラウンドで割り当てるデータ量を把握できるようにすることをお勧めします。たとえば、列を宣言する場合

CREATE TABLE foo (
  col1 VARCHAR2(10 CHAR)
)

Oracle は、データベースの文字セットに関係なく、またそのデータを格納するために必要な実際のバイト数に関係なく、10 文字のストレージにスペースを割り当てます (列あたり 4000 バイトの制限に従いVARCHAR2ます)。誰かが 10 個の 4 バイト UTF-8 文字を 1 つの行に挿入することを決定した場合に備えて列を大きくする必要がなく、列が受け入れられることをユーザーに説明する必要がないため、一般に、列サイズの定義がはるかに簡単になります。選択した言語および/または特定の文字に応じて、文字数が異なる文字列。

定期的にグローバリゼーションを扱っている Oracle の人々はそれを思いとどまらせていますが、列を宣言するときに文字長のセマンティクスを明示的に指定するか、少なくともセッション レベルでのみ設定することを好みますNLS_LENGTH_SEMANTICSVARCHAR2(10)デフォルトでは、バイト長セマンティクスではなく文字長セマンティクス (バイト長セマンティクスが必要なVARCHAR2(10 BYTE)場合は引き続き指定できます)。

于 2013-02-20T22:52:52.653 に答える