varchar2(20)和varchar2(20 byte)区别

今天,无意中看到开发环境下,有的表字段类型定义为varchar2(20)、而有的表字段定义为varchar2(20 byte)。


varchar2(20)还是varchar2(20 byte)是单位的不同,由数据库参数NLS_LENGTH_SEMANTICS决定的,有两个单位,char(字符)或者是byte(字节),该参数默认值为BYTE


从系统参数中可以知道,默认单位是byte,即20相当于20 byte,是按字节计数,而20 char是按字符计数,对于多字节字符(如汉字),varchar2(20)仅能存储6个汉字,而varchar2(20 char)能存储20个汉字。


create table tab1
(
name varchar2(20)
);




create table tab2
(
name varchar2(20 byte)
);


create table tab3
(
name varchar2(20 char)
);


select a.*,rowid from tab1 a;
select a.*,rowid from tab2 a;
select a.*,rowid from tab3 a;

select length(name) from tab1;
select length(name) from tab2;
select length(name) from tab3;


tab1和tab2是一样的意思,这里暂不展示tab1的结果。而tab2和tab3的结果展示如下,且tab2和tab3输入的内容是最大限量输入:




为什么varchar2(20 byte)仅能输入最长的数值是6个汉字呢?


这是因为字符集的不同,根据varchar2(20 byte)中jdk可存入10个汉字,utf8(不是utf-8)可存入6个汉字。


select * from nls_database_parameters;


其中服务端支持的字符集是AL32UTF8,其中AL是all的意思,指所有语言,32表示32位,UTF8编码。
oracle中GBK和UTF8的区别如下:
1、GBK的文字编码是双字节,即不管中英文,都用双字节来表示(最高位为1表示中文)
2、UTF8是一种多字节编码,即英文用1个字节,中文用三个字节来编码(若英文较多,用UTF8可以节省空间)
3、GBK是国家编码,UTF8是国际编码

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值