2011-09-19 10 views
26

私はスキーマ宣言の下に持っているコードサポートしています: -VARCHAR2(nはBYTE | CHAR)デフォルト - > CHARまたはBYTE

create table sample (
     id number Primary key, 
     username varchar2(100), 
); 

を私は& VARCHAR2がn(2つの宣言モード VARCHAR2を持っている、Oracleのマニュアルに見上げBYTE)とvarchar2(n CHAR)を指定していない場合、BYTEまたはCHARを明示的に指定しないと、 &という名前のvarchar2(500)が宣言され、500バイトが割り当てられます。

おかげで、

答えて

30

は、デフォルトでは、あなたのNLS_LENGTH_SEMANTICSパラメータに設定されているものになります。既定では、これは​​であり、文字長のセマンティクスを使用するオプションがない古いバージョンのOracleと一貫しています。独自のスキーマを定義していて、可変幅文字セット(AL32UTF8など)を使用している場合は、長さをバイト単位で指定することをほとんど常に意図しているので、NLS_LENGTH_SEMANTICSをCHARに設定することを強くお勧めします。

+13

あなたはVARCHAR列のために** CHARにNLS_LENGTH_SEMANTICSを設定する* * **がバイト4000の限界を克服しないことを追加したい場合があります。 –

+1

(https://docs.oracle.com/cd/E24693_01/server.11203/e24448/initparams149.htm)ページに記載されています。_Caution: NLS_LENGTH_SEMANTICSパラメータをCHARに設定しないことを強くお薦めしますインスタンスまたはサーバー・パラメータ・ファイルに格納します。これにより、多くの既存のインストールスクリプトが、文字長セマンティクスを持つ列を予期せず作成し、バッファオーバーフローなどのランタイムエラーを引き起こす可能性があります。ほとんどの場合、長さを文字で指定することを意図しています。それは本当に私を失望させます。私は何を知っていなければならないのですか、今はいつでも、私はいくつかの列のサイズを増やす必要があります。 – mkb

+2

@mkb - セッションレベルでパラメータを設定することもできます。インスタンスレベルで設定するリスクがないようにするには、オブジェクトを定義するときにセッションレベルでパラメータを設定します。または、Oracleのインストールスクリプトを実行する前にインスタンスレベルでBYTEに設定し直してください。 –

8

次のクエリを使用して、現在の値を確認することがあります

SELECT 
    value 

FROM 
    NLS_DATABASE_PARAMETERS 

WHERE 
    parameter='NLS_LENGTH_SEMANTICS'; 
+1

その '価値'ではなく、 'val' –

+0

@Abhijith訂正しました。 –

関連する問題