一个有意思的oracle题目

Allen at 2021-12-29 15:42:01 26 0 0 0 0
#0. (Normal)

在一个字符集为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)数。
如果提及该设置,可能就会让大家有所注意,从而不是下意识的认为了。

【版权声明】
本文为原创,遵循CC 4.0 BY-SA版权协议!转载请附上原文出处链接及本声明。
原文链接:https://tdlib.com/am.php?t=TUgddSK9eGt2
Tag:   Oracle   
未登录,请先 [ 注册 ] or [ 登录 ]
(一分钟即可完成注册!)
返回顶部  返回首页