開發環境中:有的表中欄位類型定義為varchar2(20)有的表中欄位類型定義為varchar2(20 byte)
varchar2(20)和varchar2(20 byte)是否相同呢?
相不相同是由資料庫的參數NLS_LENGTH_SEMANTICS決定的,有兩個單位,char(字元)或者位元組(byte),該參數預設值為BYTE。
所以說,在預設情況下 varchar2(20) = varchar2(20 byte)。如果參數值為CHAR 就不相等。
建議:使用統一的格式如:varchar2(20)
示範:
SQL> show parameter nls_length_semantics;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
nls_length_semantics string BYTE
SQL> create table tab1 (
2 id number(10),
3 description varchar2(20)
4 );
Table created.
SQL> create table tab2 (
2 id number(10),
3 description varchar2(20 char)
4 );
Table created.
SQL> desc tab1;
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER(10)
DESCRIPTION VARCHAR2(20)
SQL> desc tab2;
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER(10)
DESCRIPTION VARCHAR2(20 CHAR)
SQL> alter session set nls_length_semantics=char;
Session altered.
SQL> create table tab3 (
2 id number(10),
3 description varchar2(20)
4 );
Table created.
SQL> desc tab1;
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER(10)
DESCRIPTION VARCHAR2(20 BYTE)
SQL> desc tab2;
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER(10)
DESCRIPTION VARCHAR2(20)
SQL> desc tab3;
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER(10)
DESCRIPTION VARCHAR2(20)
注意:對於SYS和SYSTEM而言不受該NLS_LENGTH_SEMANTICS影響,始終為BYTE
請不要隨意修改SYSTEM層級的NLS_LENGTH_SEMANTICS,否則一些成品套件例如EBS將可能無法正常運行。