Oracle
Allen 2021-12-29 15:42:01 27151 0 0 0 0
Oracle,oracle 补丁下载地址

在一个字符集为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
我也要发一个   ·   返回首页   ·   返回[Oracle]   ·   前一个   ·   下一个
欢迎评论
未登录,
请先 [ 注册 ] or [ 登录 ]
(一分钟即可完成注册!)
返回首页     ·   返回[Oracle]   ·   返回顶部