varchar2(20)和varchar2(20 byte)区别
今天,无意中看到开发环境下,有的表字段类型定义为varchar2(20)、而有的表字段定义为varchar2(20 byte)。
varchar2(20)还是varchar2(20 byte)是单位的不同,由数据库参数NLS_LENGTH_SEMANTICS决定的,有两个单位,char(字符)或者是byte(字节),该参数默认值为BYTE
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是国际编码
varchar2(20)还是varchar2(20 byte)是单位的不同,由数据库参数NLS_LENGTH_SEMANTICS决定的,有两个单位,char(字符)或者是byte(字节),该参数默认值为BYTE
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是国际编码