参数NLS_LENGTH_SEMANTICS的设置问题
2018-09-17 14:28
1236 查看
参数NLS_LENGTH_SEMANTICS的设置问题
在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)
在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)
相关文章推荐
- 参数NLS_LENGTH_SEMANTICS的设置问题
- ORACLE NLS_LENGTH_SEMANTICS 参数问题
- nls_date_format参数设置的问题
- NLS参数设置导致的性能问题案例
- ORACLE NLS_LENGTH_SEMANTICS 参数的用途
- NLS_LENGTH_SEMANTICS参数使用注意事项
- oracle参数nls_length_semantics
- oracle 更改参数 nls_length_semantics
- ORACLE初始化参数:NLS_LENGTH_SEMANTICS
- 纠正要求修改数据库NLS_LENGTH_SEMANTICS参数的错误要求
- oracle的NLS_LENGTH_SEMANTICS参数,char,VARCHAR2型的存储方式
- 验证ORACLE不同字符集中汉字占用的byte及NLS_LENGTH_SEMANTICS参数的影响
- 关于nls_length_semantics参数
- NLS_LENGTH_SEMANTICS参数对VARCHAR2类型的字段的影响
- Oracle 字符集问题& NLS_LENGTH_SEMANTICS& 理解ORACLE数据库字符集
- nls_length_semantics参数对数据库的影响
- 关于Oracle数据库NLS_LENGTH_SEMANTICS参数的修改说明:
- 关于ImageLoader 设置圆角参数后不显示图片的问题
- IO模式设置网络编程常见问题总结—IO模式设置,阻塞与非阻塞的比较,recv参数对性能的影响—O_NONBLOCK(open使用)、IPC_NOWAIT(msgrcv)、MSG_DONTWAIT(re