char varchar nvarchar

来源:互联网 发布:软件采购合同印花税 编辑:程序博客网 时间:2024/05/22 06:06
char、varchar和varchar2

    由于varchar和varchar2用途类似,我们先来讨论char和他们的使用区别:
    varchar和varchar2比char节省空间,在效率上比char会稍微差一些,即要想获得效率,就必须牺牲一定的空间,这也就是我们在数据库设计上常说的“以空间换效率”。
    varchar和varchar2虽然比char节省空间,但是如果一个varchar和varchar2列经常被修改,而且每次被修改的数据的长度不同,这会引起‘行迁移’(Row Migration)现象,而这造成多余的I/O,是数据库设计和调整中要尽力避免的,在这种情况下用char代替varchar和varchar2会更好一些。
    当然还有一种情况就是象身份证这种长度几乎不变的字段可以考虑使用char,以获得更高的效率。

varchar和varchar2

     oracle增加了一个varchar2类型,是大家以前所没有用到过的。
     因为oracle保证在任何版本中该数据类型向上和向下兼容,但不保证varchar,还有其他数据中一般都有varchar这个数据类型。
     所以:
     如果想在oracle新版本的数据库兼容就不要用varchar,如果想和oracle之外其他数据库兼容就不要用varchar2。

nvarchar和varchar
 
     varchar是按字节存储的,而带"n"的nvarchar是按字符存储的,它表示存储的是Unicode数据类型的字符。
     字符中,英文字符只需要一个字节存储就足够了,但汉字众多,需要两个字节存储,英文与汉字同时存在时容易造成混乱,Unicode字符集就是为了解决字符集这种不兼容的问题而产生的。
     这里普及下Unicode编码:
     UNICODE编码:(狭义的UNICODE编码可能指UCS-2,也可能指UTF-16(通常指UTF-16);广义的UNICODE编码可以指包括以下四种在内的若干种对UNICODE标准的编码实现。)

     1.         UTF-32编码:固定使用4个字节来表示一个字符,存在空间利用效率的问题。
     2.         UTF-16编码:对相对常用的60000余个字符使用两个字节进行编码,其余的(即’补充字符supplementary characters’)使用4字节。
     3.         UCS-2编码:是对UNICODE早期版本的实现,它与UTF-16的唯一区别是它不包括’补充字符’,所以它对字符的编码只使用两个字节。目前此编码模式已过时。

     4.         UTF-8编码:兼容ASCII编码;拉丁文、希腊文等使用两个字节;包括汉字在内的其它常用字符使用三个字节;剩下的极少使用的字符使用四个字节。

      

【UTF-8

一个单元为 8 位,至少占用 8 位,至多占用 32 位。

由于针对英文时只占用 8 位,这对英文出现频率很高,且需要在网络上传输的网页来说,尤为有吸引力,所以现在很多网页、XML 文件都是用的 UTF-8 编码。

UTF-16

一个单元为 16 位,至少占用 16 位,至多占用 32 位。

用在 Java 和 Windows 中。

常说 Unicode 就是指 UTF-16。

UTF-32

一个单元为 32 位,至少占用 32 位,至多占用 32 位。】


    nchar、nvarchar的长度是在1到4000之间。和char、varchar比较:nchar、nvarchar则最多存储4000个字符,不论是英文还是汉字;而char、varchar最多能存储8000个英文,4000个汉字。可以看出使用nchar、nvarchar数据类型时不用担心输入的字符是英文还是汉字,较为方便,但在存储英文时数量上有些损失。
    比如说 varchar(40),能存储40个字节长度的字符,存储中文字符的时候,因为中文字符1个字符就等于2个字节,所以varchar(40)只能存储20个中文字符。但是nvarchar(40)就可以存储40个中文字符(注意:同时也只能存储40个英文字符),同时nvarchar要相对于存储的是Unicode字符类型,比如有些字符是占3个字节的,所以nvarchar(40)实际上占用的存储空间可能不值80个字节。
    
原创粉丝点击