在Oracle資料庫中和Oracle FORM中都 有這樣一個參數的設定,有必要澄清一下:
參數NLS_LENGTH_SEMANTICS的含義在Oracle文檔中這樣描述:
Oracl文檔中的說明:
Syntax: NLS_LENGTH_SEMANTICS = string
Range of values: BYTE | CHAR
NLS_LENGTH_SEMANTICS enables you to create CHAR and VARCHAR2 columns using either byte or character length semantics. Existing columns are not affected.
NCHAR, NVARCHAR2, CLOB, and NCLOB columns are always character-based. You may be required to use byte semantics in order to maintain compatibility with existing applications.
NLS_LENGTH_SEMANTICS does not apply to tables in SYS and SYSTEM. The data dictionary always uses byte semantics.
翻譯過來的意思就是該參數有BYTE和CHAR兩種取值,使你能夠使用這兩種語義建立CHAR或VARCHAR2類型的資料庫表列,而對現有的列沒有影響。
二者的區別就是一個是按字元存放,另一個按位元組存放;一般情況資料庫都會使用UTF-8編碼,一個漢字如果按位元組存放,就需要3個位元組。
舉例說明:
SQL> create table t1 (col1 varchar2(8));
Table created.
但是測試插入三個漢字的時候就報錯了。
SQL> insert into t1 values('一二三');
insert into t1 values('一二三')
*
ERROR at line 1:
ORA-12899: value too large for column "NC31"."T1"."COL1" (actual: 9, maximum:8)
檢查相關參數及環境變數。
SQL> select * from NLS_DATABASE_PARAMETERS
可以看到資料庫中參數NLS_LENGTH_SEMANTICS的設定 ,一般預設為‘BYTE’。
這是因為按位元組存放,3個漢字就需要9個位元組,如果把參數NLS_LENGTH_SEMANTICS設定為‘CHAR’,就可以將資料插入進去了。這是因為按資料庫會按字元計數,而不是位元組。
Oracle Form中:
ITEM屬性設定 中也有Data Length Semantics這樣一個屬性設定,它有三種選擇“NULL”、“CHAR”和“BYTE”,如果設定 為“NULL”則直接從資料庫中擷取,使用資料庫的設定。設定為“CHAR”和“BYTE”則和上述資料庫中的情況一樣。經過測試發現,如果一個字元類型的ITEM的最大長度為100,則當Data Length Semantics設定為“CHAR”時,最多可以輸入100個漢字或100個英文字元;當Data Length Semantics設定為“BYTE”時,最多可以輸入33個漢字或100個英文字元。