char、varchar和varchar2,以及nvarchar和nvarchar2的区别与联系

一、前言:

1. 定长或变长
定长就是长度固定的,当输入的数据长度没有达到指定的长度时,将自动以英文空格在其后面填充,使长度达到相应的长度。有var前缀的,表示实际储存空间是变长的,比如varchar、nvarchar,这些类型的数据长度未达到设定的容量时,不会加空格填充。
2. Unicode或非Unicode
数据库中,英文字符只需要一个字节存储就足够了,但汉字和其他众多非英文字符,则需要两个字节(和数据库编码方式有关)存储。如果英文与汉字同时存在,由于占用空间数不同,容易造成混乱,导致读取出来的字符串是乱码。Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。而前缀n就表示Unicode字符,比如nchar,nvarchar,这两种类型使用了Unicode字符集。

3. oracle数据类型 - 字符类型

char(大小 byte/char) 定长字符类型,存储的是字节/字符(未达到指定长度时,自动在末尾用空格补全);默认值为1;最大2000字节;非unicode。
nchar() 定长字符类型,存储的是Unicode字符(未达到指定长度时,自动在末尾用空格补全);默认值为1;最大1000字符;根据unicode,每个Unicode字符通常根据编码方式不同占用不同字节。

varchar(大小 char/byte)  变长字符类型(未达到指定长度时,不自动补全空格);定义时需指定长度;最大为4000字节;非unicode。

varchar2(大小 char/byte) 变长字符类型(未达到指定长度时,不自动补全空格);定义时需指定长度;最大为4000字节;非unicode。
nvarchar2 变长字符类型(未达到指定长度时,不自动补全空格);定义时需指定长度;最大为2000字符,根据unicode,每个Unicode字符通常根据编码方式不同占用不同字节。

 

除N开头的其他类型默认是byte,当然也可以设置char,如char(char),varchar2(char)

二、区别与联系

1. varchar与varchar2

相同点:
(1)都是长度不固定的;
(2)都区分中英文,这点同char;
(3)都是最大4000字节;
...
不同点:
(1)VARCHAR2是Oracle提供的特定数据类型,Oracle可以保证VARCHAR2在任何版本中该数据类型都可以向上和向下兼容。
而VARCHAR在多种数据库有较好的兼容性,如sqlserver中经常用到VARCHAR,但在Oracle中不建议使用;
(2)VARCHAR2把空串等同于null处理,而varchar仍按照空串处理;

注意:
(1)varchar/
VARCHAR2字符要用几个字节存储,要看数据库使用的字符集.
比如GBK,汉字就会占两个字节,英文1个;
如果是UTF-8,汉字一般占3个字节,英文还是1个。
但是一般情况下,我们都认为是两个字节处理,因为oracle安装时候默认我们都选择GBK的编码格式,
但是我们在页面做输入字符串长度的校验的时候,还是以数据库设计字段最大长度除3来作为最大长度.
防止数据库移植时设置不同编码格式;比如:VARCHAR2(10),一般情况下最多存放5个汉字,10个字符
(2)varchar/varchar2适用于长度不固定的,一般不含中文的情况;

2. VARCHAR2和NVARCHAR2

   (1) VARCHAR2(size type),size最大为4000,type可以是char也可以是byte,不标明type时默认是byte(如:name  VARCHAR2(60)),但最大空间仍然是4000byte;

        NVARCHAR2(size),size最大值为2000,单位是字符,;

  (2) VARCHAR2最多存放4000字节的数据,最多可以可以存入4000个字母,或最多存入2000个汉字(数据库字符集编码是GBK时,varchar2最多能存放2000个汉字,数据库字符集编码是UTF-8时,那就最多只能存放1333个汉字,呵呵,以为最大2000个汉字的傻了吧!)NVARCHAR2(size),size最大值为2000,单位是字符,而且不管是汉字还是字母,每个字符的长度都是2个字节。所以nvarchar2类型的数据最多能存放2000个汉字,也最多只能存放2000个字母。并且NVARCHAR2不受数据库字符集的影响。

三、oracle数据类型 - 其他

  详见:https://blog.csdn.net/shao_yc/article/details/103022634

 

1. NUMBER(p,s)

精度为p并且数值范围为s的数值;精度p的范围从1到38;数值范围s的范围是从-84到127;
例如:NUMBER(5,2) 表示整数部分最大3位,小数部分为2位;
NUMBER(5,-2) 表示数的整数部分最大为7其中对整数的倒数2位为0,前面的取整。
NUMBER 表示使用默认值,即等同于NUMBER(5);

2. LONG

可变长度的字符数据,其长度可达2G个字节;

3. DATE

有效日期范围从公元前4712年1月1日到公元后4712年12月31日

4. RAW(size)

长度为size字节的原始二进制数据,size的最大值为2000字节;你必须为RAW指定一个size;

LONG RAW

可变长度的原始二进制数据,其最长可达2G字节;

CHAR(size)

固定长度的字符数据,其长度为size个字节;size的最大值是2000字节,而最小值和默认值是1;

NCHAR(size)

也是固定长度。根据Unicode标准定义

CLOB(Character Large Object)

一个字符大型对象,可容纳单字节的字符;不支持宽度不等的字符集;最大为4G字节

NCLOB

一个字符大型对象,可容纳单字节的字符;不支持宽度不等的字符集;最大为4G字节;储存国家字符集

BLOB(binary large object)二进制大对象

一个二进制大型对象;最大4G字节

BFILE

包含一个大型二进制文件的定位器,其储存在数据库的外面;使得可以以字符流I/O访问存在数据库服务器上的外部LOB;最大大小为4G字节.

posted @ 2018-03-27 11:38  达摩院的BLOG  阅读(1220)  评论(0编辑  收藏  举报