2011-09-19 97 views
26

我支持有以下模式聲明代碼: -VARCHAR2(N BYTE | CHAR)默認 - > CHAR或BYTE

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

我擡頭對Oracle文檔& VARCHAR2有兩種申報方式 VARCHAR2(N BYTE)和varchar2(n CHAR),如果我沒有明確指定BYTE或CHAR只是聲明用戶名varchar2(500),那麼將分配500個BYTES還是500個字符?

感謝,

回答

30

默認會無論你NLS_LENGTH_SEMANTICS參數設置爲。默認情況下,即​​與舊版本的Oracle不存在使用字符長度語義的選項一致。如果你正在定義你自己的模式,並且你正在使用可變寬度的字符集(比如AL32UTF8),我強烈建議將NLS_LENGTH_SEMANTICS設置爲CHAR,因爲你幾乎總是打算用字符而不是字節來指定長度。

+13

你可能想補充一點,NLS_LENGTH_SEMANTICS設置爲CHAR將*不*克服的4000 **字節的限制**爲VARCHAR列。 –

+1

at [this](https://docs.oracle.com/cd/E24693_01/server.11203/e24448/initparams149.htm)page it says:_Caution: Oracle強烈建議您不要將NLS_LENGTH_SEMANTICS參數設置爲CHAR在實例或服務器參數文件中。這可能會導致許多現有的安裝腳本意外地創建具有字符長度語義的列,導致運行時錯誤,包括緩衝區溢出。正如您所說的,它幾乎總是用於指定字符長度。這真讓我感到灰心。我該怎麼做才知道,我現在需要增加一些列大小。 – mkb

+2

@mkb - 參數也可以在會話級別進行設置。如果您不想將其設置爲實例級別,則在定義對象時在會話級別設置參數。或者在運行Oracle安裝腳本之前,將它在實例級別設置回BYTE。 –

8

您可以使用下面的查詢檢查當前值:

SELECT 
    value 

FROM 
    NLS_DATABASE_PARAMETERS 

WHERE 
    parameter='NLS_LENGTH_SEMANTICS'; 
+1

它的'價值',而不是'瓦爾' –

+0

@Abhijith作出更正。 –

相關問題