關於nls_length_semantics參數

文檔說明如下:
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爲準。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章