【转】CHAR CHARACTER VARCHAR NCHAR NVARCHAR NVARCHAR2区别

oracle提供了五种字符数据类型:char、nchar、varchar、varchar2、nvarchar2。
    char:使用数据库字符集来存储数据,长度固定,如果存储的数据没有达到指定长度,自动补足空格。指定长度时,默认长度的计量单位由 NLS_LENGTH_SEMANTICS(默认为字节byte)参数决定,但是我们可以手动指定为char或者byte。oracle建议使用 NLS_LENGTH_SEMANTICS来指定计量单位,这样可以提高效率。char类型的最大存储长度为2000个字节,在plsql中,最大存储长 度可以达到32767个字节。使用char时,可以不指定最大长度,此时最大长度为1.
    nchar:使用国家字符集来存储数据,长度固定,如果存储的数据没有达到指定长度,数据库自动补足空格。指定长度时,采用char为计量单位,不可以手动指定其他单位。最大存储长度为2000个字节,在plsql中,其最大存储长度可以达到32767个字节。使用nchar时,可以不指定最大长度,此时,最大长度为1.
  varchar2: 使用数据库字符集存储数据,长度可变,如果存储数据没有达到指定长度,不自动补足空格。可使用char,byte为计量单位,默认受参数 NLS_LENGTH_SEMANTICS的影响。最大存储长度为4000个字节,在plsql中,存储长度可达32767个字节。必须指定最大长度,长 度最小值为1.
  nvarchar2:使用国家字符集来存储数据,长度可变,如果存储的数据没有达到指定长度,不自动补足空格。指定长度时,采用char为计量单位,不可 以手动指定其他单位。最大存储长度为4000个字节,在plsql中,其最大存储长度可以达到32767个字节。必须指定最大长度,长度最小值为1.
  varchar:oracle目前并没有实现该数据类型,当前版本下,varchar与varchar2完全一致,但不保证将来不会单独设计varchar。
 
  
区分:
      1.CHAR的长度是固定的,而VARCHAR2的长度是能够变化的, 比如,存储字符串“abc",对于CHAR (20),表示您存储的字符将占20个字节(包括17个空字符),而同样的VARCHAR2 (20)则只占用3个字节的长度,20只是最大值,当您存储的字符小于20时,按实际长度存储。
      2.CHAR的效率比VARCHAR2的效率稍高
      3.现在VARCHAR是VARCHAR2的同义词。工业标准的VARCHAR类型能够存储空字符串,但是oracle不这样做,尽管他保留以后这样做的 权利。Oracle自己研发了一个数据类型VARCHAR2,这个类型不是个标准的VARCHAR,他将在数据库中varchar列能够存储空字符串的特 性改为存储NULL值。假如您想有向后兼容的能力,Oracle建议使用VARCHAR2而不是VARCHAR。

何时该用CHAR,何时该用varchar2?

    CHAR和VARCHAR2是一对矛盾的统一体,两者是互补的关系.
  VARCHAR2比CHAR节省空间,在效率上比CHAR会稍微差一些,即要想获得效率,就必须牺牲一定的空间,这也就是我们在数据库设计上常说的‘以空间换效率’。
  VARCHAR2虽然比CHAR节省空间,但是假如一个VARCHAR2列经常被修改,而且每次被修改的数据的长度不同,这会引起‘行迁移’(Row Migration)现象,而这造成多余的I/O,是数据库设计和调整中要尽力避免的,在这种情况下用CHAR代替VARCHAR2会更好一些。
nvarchar不区分中英文,比如说:你定义了nvarchar(20),你可以存入20个英文字母/汉字或中英文组合,这个20定义的是字符数而不是字节数

nvarchar2基本上等同于nvarchar,不同在于nvarchar2中存的英文字母也占两个字节

nvarchar/nvarchar2适用于存放中文 

无论是varchar2还是nvarchar2,最大字节数都是4000

varchar2(byte):就是默认的表示方式,比如我们写成:varchar2(100),就相当于varchar2(100 byte),表示最大字节数是100,该字段最多能容纳100个字节,强调空间大小。由于我们描述的是字节,因此,保存汉字等字符时,就要小心了。如果你的数据库用的是GBK编码,那么一个汉字将占用2个字节,最多能存50个汉字,如果你的数据库用的是UTF8编码,那么一个汉字将占用3个字节,最多能存33个汉字。

varchar2(char):表示最大字符数是100,该字段最多能容纳100个字符,强调个数。假设我们写成varchar2(100 char),那么无论是数字、字母、汉字,都看成一个字符,最多写100个,当然,汉字越多,占用的空间越大,同样遵循上边的数据库编码原则。例如:存入一个汉字,底层占2或3个字节,存入一个字母,占1个字节,绝对不是某些文章所说1个字母或数字也占2或3个字节!

nvarchar2():没有byte、char之分,类似于varchar2(char),只不过nvarchar2()屏蔽了数据库编码,无论是何种编码,nvarchar2()中一个汉字都占两个字节。

实际应用中,很可能会出现这种写法:varchar2(1400 char),我们主观的认为,这个字段最长不能超过1400个字符,这意味着我们可能会存入1399个字符,貌似很正确的样子。

但是,如果这1399个字符都是汉字,字符长度并没有超过1400,看起来一切正常,但实际上我们损失了一部分数据,为什么?

因为1399个汉字,按UTF8编码来说(99%的项目都是UTF8编码吧。。),需要占用1399*3=4197个字节,而文章开篇就说,无论是什么char,最大长度就是4000字节,一个也不能多,因此多出来的197个字节,都会抹去,而整个过程中,无任何错误提示,你的数据就这样蒸发了!

上一篇:字符编码详解及由来(UNICODE,UTF-8,GBK)[转帖]


下一篇:Mysql流程控制函数