ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 参数NLS_LENGTH_SEMANTICS的设置问题

参数NLS_LENGTH_SEMANTICS的设置问题

原创 Linux操作系统 作者:lsq_008 时间:2008-09-22 20:38:13 0 删除 编辑

在Oracle数据库中和Oracle FORM中都 有这样一个参数的设置,有必要澄清一下:

参数NLS_LENGTH_SEMANTICS的含义在Oracle文档中这样描述:

Oracl文档中的说明: Syntax: NLS_LENGTH_SEMANTICS = string 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 SYS and SYSTEM. The data dictionary always uses byte semantics.

翻译过来的意思就是该参数有BYTE和CHAR两种取值,使你能够使用这两种语义创建CHAR或VARCHAR2类型的数据库表列,而对现有的列没有影响。

二者的区别就是一个是按字符存放,另一个按字节存放;一般情况数据库都会使用UTF-8编码,一个汉字如果按字节存放,就需要3个字节。

可以看到数据库中参数NLS_LENGTH_SEMANTICS的设置 ,一般默认为‘BYTE’。

这是因为按字节存放,3个汉字就需要9个字节,如果把参数NLS_LENGTH_SEMANTICS设置为‘CHAR’,就可以将数据插入进去了。这是因为按数据库会按字符计数,而不是字节。

Oracle Form中:

ITEM属性设置 中也有Data Length Semantics这样一个属性设置,它有三种选择“NULL”、“CHAR”和“BYTE”,如果设置 为“NULL”则直接从数据库中获取,使用数据库的设置。设置为“CHAR”和“BYTE”则和上述数据库中的情况一样。经过测试发现,如果一个字符类型的ITEM的最大长度为100,则当Data Length Semantics设置为“CHAR”时,最多可以输入100个汉字或100个英文字符;当Data Length Semantics设置为“BYTE”时,最多可以输入33个汉字或100个英文字符。

举例如下:

SQL> show parameter nls_length

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
nls_length_semantics                 string      BYTE
SQL> create table byte_test (a varchar2(3));

表已创建。

SQL> insert into byte_test values('甲骨文');
insert into byte_test values('甲骨文')
                             *
ERROR 位于第 1 行:
ORA-01401: inserted value too large for column


SQL> alter session set NLS_LENGTH_SEMANTICS='CHAR';

会话已更改。

SQL> create table char_test (a varchar2(3));

表已创建。

SQL> insert into char_test values('甲骨文');

已创建 1 行。

SQL> show parameter  NLS_LENGTH_SEMANTICS

NAME                                 TYPE
------------------------------------ ----------------------
VALUE
------------------------------
nls_length_semantics                 string
CHAR
SQL> desc byte_test;
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------

 A                                                  VARCHAR2(3 BYTE)

SQL> desc char_test;
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------

 A                                                  VARCHAR2(3)

 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/10972173/viewspace-462518/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
十余年大型金融及电信系统数据库管理经验,曾服务于中国建设银行、中国移动。对oracle,mysql数据库有深入了解。 擅长python开发,独立开发了开源数据库自动化监控运维平台Power Monitor。

注册时间:2008-02-29

最新文章