NLS_LENGTH_SEMANTICS 在多字节字符集的作用

今日在网上看到NLS_LENGTH_SEMANTICS参数,好像是对多字符集数据库有一些影响,在平时建立table时有时也遇到过byte和char,正好来研究一下,发现好像此参数在10.2.0.3中已不起作用了。[@more@]

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

请使用浏览器的分享功能分享到微信等