在一个字符集为AL32UTF8的Oracle数据库上,执行以下SQL后,请问最后一个SQL输出的结果为何?
create table len_test(id number,c1 char(10));
insert into len_test values(1,'中AB');
select length(c1) from len_test;
A、8
B、3
C、5
D、10
实测:
oracle10g(字符集不对)
SQL> create table len_test(id number,c1 char(10));
表已创建。
SQL> insert into len_test values(1,'中AB');
已创建 1 行。
SQL> select length(c1) from len_test;
LENGTH(C1)
----------
9
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
PL/SQL Release 10.2.0.4.0 - Production
CORE 10.2.0.4.0 Production
TNS for 64-bit Windows: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production
SQL> show parameter nls_length
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
nls_length_semantics string BYTE
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
SIMPLIFIED CHINESE_CHINA.ZHS16GBK
oracle11g
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE 11.2.0.4.0 Production
TNS for 64-bit Windows: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production
SQL>
SQL> create table len_test(id number,c1 char(10));
Table created
SQL> insert into len_test values(1,'中AB');
1 row inserted
SQL> select length(c1) from len_test;
LENGTH(C1)
----------
9
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
SIMPLIFIED CHINESE_CHINA.ZHS16GBK
SQL> show parameter nls_length;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
nls_length_semantics string BYTE
精彩讨论
此题不严谨,需要有个前提:nls_length_semantics=byte.例如以下场景,答案就不一样了:
---session 1:
alter session set nls_length_semantics=char;
create table d(a char(10));
insert into d values('中AB');
select length(a) from d;
【回复】
最初想过是否明确指明这个前提。但考虑到以下几点,我最终放弃了:
1、该参数值默认为BYTE。
2、Oracle的官方文档中,也强烈建议不要修改该参数。
3、出这道题的目的,也是想让大家认识到LENGTH函数返回的是字符(CHAR)数,而不是字节(BYTE)数。
如果提及该设置,可能就会让大家有所注意,从而不是下意识的认为了。
Tag:
Oracle