NLS_LENGTH_SEMANTICS 在多字节字符集的数据库中决定CHAR, VARCHAR2的长度。数据库创建表时,依据这个值来确定实际列的长度,例如数据库字符集为ZHS16GBK
数据库版本是10.2.0.3
SQL> select * From v$version where rownum=1;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Prod
SQL> select * from v$nls_parameters where parameter='NLS_CHARACTERSET';
PARAMETER VALUE
---------------------------------------------------------------- -----------------------------------
NLS_CHARACTERSET ZHS16GBK
SQL> show parameter nls_length_semantics
NAME TYPE VALUE
------------------------------------ ----------- -------------
nls_length_semantics string BYTE
SQL> create table test ( a varchar2(4)) ;
表已创建。
SQL> desc test;
名称 是否为空? 类型
----------------------------------------- -------- -------------------
A VARCHAR2(4)
SQL> insert into test values('中国人民');
insert into test values('中国人民')
*
第 1 行出现错误:
ORA-12899: 列 "SYS"."TEST"."A" 的值太大 (实际值: 8, 最大值: 4)
改变参数值为CHAR
SQL> alter session set nls_length_semantics = CHAR ;
会话已更改。
SQL> show parameter nls_length_semantics
NAME TYPE VALUE
------------------------------------ ---------------------- --------
nls_length_semantics string CHAR
SQL> create table test1 (a varchar2(4));
表已创建。
SQL> desc test1;
名称 是否为空? 类型
----------------------------------------- -------- -------------------
A VARCHAR2(4)
SQL> insert into test1 values('中国人民');
insert into test1 values('中国人民')
*
第 1 行出现错误:
ORA-12899: 列 "SYS"."TEST1"."A" 的值太大 (实际值: 8, 最大值: 4)
改了参数nls_length_semantics,好像建立的table并没有用此值作为默认值。
直接在建表时指定char类型,成功插入。
SQL> create table test2 (a varchar2(4 char));
表已创建。
SQL> insert into test2 values('中国人民');
已创建 1 行。
此操作并没有说明NLS_LENGTH_SEMANTICS参数的作用,但已证明建表时 byte和char的区别。
参考:http://www.oracle-base.com/articles/9i/CharacterSemanticsAndGlobalization9i.php