char() 中文字符和英文字符字节占用
1.创建测试表和测试数据
SYS@db11g> create table t1016 (name char(10));
Table created.
CHAR(10) 表示这个列有固定长度 10 个字节
SYS@db11g> insert into t1016 values('历史');
1 row created.
SYS@db11g> commit;
2.查看字符长度和字节长度
SYS@db11g> select length('历史'),lengthb('历史') from dual;
LENGTH('历史') LENGTHB('历史')
-------------- ---------------
2 6
LENGTH 函数计算并返回字符串中字符的数量。
LENGTHB 函数计算并返回字符串的字节数。
3.测试中文字符的字节占位情况
SYS@db11g> select name,length(name),lengthb(name) from t1016;
NAME LENGTH(NAME) LENGTHB(NAME)
---------- ------------ -------------
历史 6 10
SYS@db11g> select VALUE from nls_database_parameters where PARAMETER='NLS_CHARACTERSET';
VALUE
------------------------------
AL32UTF8
中文字符在 AL32UTF8 字符集中占用 3 个字节
name char(10) ->'历史'->'历史'占用2*3=6个字节->char(10) 再补4个空格为10个字节
lengthb(name) 字节长度为10。
'历史'占用2个中文字符,加上新补的4个空格(4个空格字符)LENGTH(NAME)字符长度为2+4=6。
SYS@db11g> select name,length(name),lengthb(name),dump(name,16) from t1016;
NAME LENGTH(NAME) LENGTHB(NAME) DUMP(NAME,16)
---------- ------------ ------------- ------------------------------------------------------------
历史 6 10 Typ=96 Len=10: e5,8e,86,e5,8f,b2,20,20,20,20
SYS@db11g> select dump(' ',16) from dual;
DUMP('',16)
----------------
Typ=96 Len=1: 20
补充的空格16进制为20
4.测试英文字符的字节占位情况
SYS@db11g> insert into t1016 values('a');
1 row created.
SYS@db11g> commit;
Commit complete.
SYS@db11g> select name,length(name),lengthb(name),dump(name,16) from t1016;
NAME LENGTH(NAME) LENGTHB(NAME) DUMP(NAME,16)
---------- ------------ ------------- ------------------------------------------------------------
历史 6 10 Typ=96 Len=10: e5,8e,86,e5,8f,b2,20,20,20,20
a 10 10 Typ=96 Len=10: 61,20,20,20,20,20,20,20,20,20
'a' 1个英文字符占用1个字节,保存到char(10)需要补全9个空格,因此字符长度为10个(1+9=10),字节长度为10个(1+9=10)