结论: UTF-8字符集: 一个汉字占三个字节 GBK字符集:一个汉字占二个字节
验证: oracle AMERICAN_AMERICA.AL32UTF8字符集下 一个汉字占3个字节
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.AL32UTF8
SQL> select lengthb('你') from dual;
LENGTHB('你')
------------
3
SQL> select lengthb('你好') from dual;
LENGTHB('你好')
---------------
6
创建测试表,针对grade字段varchar(4)变量验证:
create table test1.test001 (id number(10) primary key ,name varchar(8),grade VARCHAR(4));
SQL> insert into test1.test001 values(1,'maomao','您好');
insert into test1.test001 values(1,'maomao','您好')
*
ERROR at line 1:
ORA-12899: value too large for column "TEST1"."TEST001"."GRADE" (actual: 6,
maximum: 4)
报错提示varchar(4)最大时4字节,然而插入'您好'2个汉字占用6字节, 修改字段grade varchar变量值为6个字节
SQL> alter table test1.test001 modify GRADE VARCHAR(6);
Table altered.
SQL> insert into test1.test001 values(1,'maomao','您好');
1 row created.
SQL> commit;
Commit complete.
SQL> select * from test1.test001;
ID NAME GRADE
---------- -------- ------
1 maomao 您好
oracle AMERICAN_AMERICA.ZHS16GBK字符集下 一个汉字占2个字节:
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
--------------------------------------------------------------------------------
AMERICAN_AMERICA.ZHS16GBK
SQL> select lengthb('你') from dual;
LENGTHB('你')
-------------
2
SQL> select lengthb('你好') from dual;
LENGTHB('你好')
---------------
4
创建测试表test02, 字段grade变量VARCHAR(4) 为4字节,插入'你好'2个汉字,由于库是 AMERICAN_AMERICA.ZHS16GBK字符集,'你好'正好是4字节,插入成功
SQL> create table test1.test002 (id number(10) primary key ,name varchar(8),grade VARCHAR(4));
Table created.
SQL> insert into test1.test002 values(1,'maomao','您好');
1 row created.
SQL> select * from test1.test002;
ID NAME GRADE
---------- ------------------------ ------------
1 maomao 您好
验证得到的结论是正确的,验证结束。