文字セットが WE8MSWIN1252 に設定されているデータベースがありますが、これは 1 バイト文字セットであると理解しています。
次のスクリプトを実行して、スキーマとそのテーブルを作成しました。
ALTER SYSTEM SET NLS_LENGTH_SEMANTICS=CHAR
基礎となる文字セットがシングルバイトであるのに、文字セマンティクスを持つ VARCHAR2 列を使用しているため、データが失われる可能性はありますか?
文字セットが WE8MSWIN1252 に設定されているデータベースがありますが、これは 1 バイト文字セットであると理解しています。
次のスクリプトを実行して、スキーマとそのテーブルを作成しました。
ALTER SYSTEM SET NLS_LENGTH_SEMANTICS=CHAR
基礎となる文字セットがシングルバイトであるのに、文字セマンティクスを持つ VARCHAR2 列を使用しているため、データが失われる可能性はありますか?
Windows-1252 のようなシングルバイト文字セットを使用している場合、文字またはバイトのどちらのセマンティクスを使用しているかは関係ありません。VARCHAR2(10 CHAR)
各文字は正確に 1 バイトを占めるため、列が宣言されているかどうかは関係ありませんVARCHAR2(10 BYTE)
。いずれの場合も、最大 10 文字の最大 10 バイトのストレージが割り当てられます。
設定を変更してもメリットがないため、実行する必要がある他のスクリプト (Oracle のスクリプトなど) で問題が発生する可能性が低いNLS_LENGTH_SEMANTICS
ため、設定をデフォルト ( ) のままにしておく必要があります。BYTE
素晴らしい質問です。マルチバイト文字は必要なバイト数を占めるため、予想以上に多くのストレージを使用する可能性があります。4 バイト文字を varchar2(4) 列に格納すると、4 バイトすべてが使用されたことになります。varchar2(4 char) 列に 4 バイト文字を格納すると、1 文字しか使用されません。多くの外国語と特殊文字は 2 バイト文字セットを使用するため、「データを把握」し、それに応じてデータベースの列定義を作成することをお勧めします。NLS_LENGTH_SEMANTICS を CHAR に変更すると、CHAR または VARCHAR2 として定義されたすべての新しい列が影響を受けるため、オラクルではお勧めしません。これには、インプレース アップグレードを行う際のカタログ テーブルも含まれる可能性があります。これがおそらく良い考えではない理由がわかります。他の Oracle ツールセットおよびインターフェースでも問題が発生する可能性があります。