Property Description
Parameter type String
Syntax NLS_LENGTH_SEMANTICS = string
Example: NLS_LENGTH_SEMANTICS = 'CHAR'
Default value BYTE
Modifiable ALTER SESSION
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 the SYS schema.
--測試環境
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE 11.2.0.3.0 Production
TNS for IBM/AIX RISC System/6000: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production
SQL> show parameter nls_length_se;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
nls_length_semantics string BYTE
SQL> col parameter for a20;
SQL> col value for a10;
SQL> select * from nls_database_parameters where parameter ='NLS_CHARACTERSET';
PARAMETER VALUE
-------------------- ----------
NLS_CHARACTERSET ZHS16GBK
SQL> alter session set nls_length_semantics=char;
Session altered.
SQL> show parameter nls_length_;
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
nls_length_semantics string
CHAR
--實驗一:創建表時nls_length_semantics=char
SQL> create table t_nls_length_semantics(col1 varchar2(3),col2 char(3));
Table created.
SQL> insert into t_nls_length_semantics values ('我我我','我我我');
1 row created.
SQL> commit;
Commit complete.
--session 2 針對該表insert 也成功
SQL> show parameter nls_length_semantics;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
nls_length_semantics string BYTE
SQL> select * from t_nls_length_semantics;
COL1 COL2
------ ------
我我我 我我我
SQL> insert into t_nls_length_semantics values ('你你你','你你你');
1 row created.
SQL> commit;
--實驗二:創建表時nls_length_semantics=byte
--session 1 更改nls_length_semantics=byte後,創建表t_nls_length_semantics_2測試
SQL> alter session set nls_length_semantics=byte;
Session altered.
SQL> create table t_nls_length_semantics_2(col1 varchar(3),col2 char(3));
Table created.
--表創建時,nls_length_semantics=byte,之後更改沒用。
SQL> alter session set nls_length_semantics=char;
Session altered.
SQL> insert into t_nls_length_semantics_2 values ('我我我','我我我');
insert into t_nls_length_semantics_2 values ('我我我','我我我')
*
ERROR at line 1:
ORA-12899: value too large for column "AFA"."T_NLS_LENGTH_SEMANTICS_2"."COL1"
(actual: 6, maximum: 3)
--實驗三,創建表時nls_length_semantics=char,未插入數據。
SQL> alter session set nls_length_semantics=char;
Session altered.
SQL> create table t_nls_length_semantics_3 (col1 varchar2(3),col2 char(3));
Table created.
SQL> exit
--退出,新建session
SQL> show parameter nls_length_semantics;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
nls_length_semantics string BYTE
SQL> insert into t_nls_length_semantics_3 values ('我我我','你你你');
1 row created.
SQL> commit;
Commit complete.
SQL> select * from t_nls_length_semantics_3;
COL1 COL2
------ ------
我我我 你你你
--實驗四,針對sys用戶下測試。
SQL> show user;
USER is "SYS"
SQL> show parameter nls_length_semantics;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
nls_length_semantics string BYTE
SQL> alter session set nls_length_semantics=char;
Session altered.
SQL> show parameter nls_length_semantics
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
nls_length_semantics string BYTE
nls_length_semantics string CHAR
SQL> create table test (col1 varchar2(3),col2 char(3));
Table created.
SQL> insert into test values ('我我我','你你你');
insert into test values ('我我我','你你你')
*
ERROR at line 1:
ORA-12899: value too large for column "SYS"."TEST"."COL1" (actual: 6, maximum:
3)
SQL> drop table test purge;
Table dropped.
--補充實驗,以上可知。
19:15:50 YANG@orcl>alter session set nls_length_semantics=char;
會話已更改。
19:16:29 YANG@orcl>drop table test;
表已刪除。
19:16:37 YANG@orcl>create table test (col1 varchar2(3), col2 char(3));
表已創建。
19:17:17 YANG@orcl>select column_name,data_length from dba_tab_cols where table_name ='TEST';
COLUMN_NAME DATA_LENGTH
------------------------------ -----------
COL2 6
COL1 6
總結:NLS_LENGTH_SEMANTICS決定表字符串類型長度,以字節還是字符爲單位。
以在表創建時,NLS_LENGTH_SEMANTICS參數爲準,表創建完成時,更改NLS_LENGTH_SEMANTICS參數
不會對錶中類型長度造成影響( Existing columns are not affected.)。
sys用戶以默認byte爲準。