最大の変化だけに関心がない限り、あなたの例は正しくありません。
AL32UTF8は、可変長の文字セットです。一般的に言えば、US7ASCII文字セットに含まれる文字はすべて1バイト、ヨーロッパの文字は通常2バイト、さまざまなアジア言語の文字は3バイト、少数の非常にまれな文字は4バイトを必要とします。現実的には、実際のWE8ISO8859P1データをAL32UTF8に変換する場合、実際には、有効なWE8ISO8859P1文字ごとにUnicodeマッピングを検索しなくても、実際には1と2の間の変換係数が1から2にはるかに近いことがわかります。 、AL32UTF8文字セットに3バイトまたは4バイトのストレージが必要な場合は驚きます。
グローバル化サポートガイドには、に関するセクションがあります。文字セット これは、どの文字セットがシングルバイトで、どれがマルチバイトで、どのマルチバイト文字セットが固定幅であるかを示します。ほとんどすべてのマルチバイト文字セットは可変幅であるため、探している係数はデータによって異なります。
ほとんどの場合、とにかくバイト長のセマンティクスではなく文字長のセマンティクスを使用するように列を宣言して、データベースに割り当てるデータの量をバックグラウンドで把握させることをお勧めします。たとえば、列を宣言する場合
CREATE TABLE foo (
col1 VARCHAR2(10 CHAR)
)
Oracleは、データベースの文字セットに関係なく、またそのデータを格納するために必要な実際のバイト数に関係なく、10文字のストレージにスペースを割り当てます(VARCHAR2
あたり4000バイトの制限に従います)。 桁)。これにより、誰かが10個の4バイトUTF-8文字を1行にスローすることにした場合に列のサイズを大きくする必要がなく、列が受け入れることをユーザーに説明する必要がないため、一般に列サイズの定義がはるかに簡単になります。言語や選択した特定の文字に応じて、文字数が異なる文字列。
グローバリゼーションを定期的に扱っているオラクルの人々はNLS_LENGTH_SEMANTICS
初期化パラメータ
VARCHAR2(10)
を発生させる デフォルトでは、バイト長セマンティクスではなく文字長セマンティクスを使用します(VARCHAR2(10 BYTE)
を指定することもできます バイト長のセマンティクスが必要な場合)。