varchar和nvarchar的区别和什么情况下用?

来源:互联网 发布:窦靖童唱功知乎 编辑:程序博客网 时间:2024/06/06 00:39
varchar和nvarchar的区别和什么情况下用?  

2011-07-06 10:29:41|  分类: 默认分类 |  标签:varchar  nvarchar  char  nchar   |举报|字号 订阅
学习数据库基本类型的时候,碰到了这个问题。下面讲解的SQLServer中的这两种类型的区别和使用情况。

一、基本区别:

1、char、varchar

char(n):  定长数据类型,n为能存储的最大字节长度(取值范围1~8000),当存入字符数少于n的时候,末尾用空格不足。当存入字符数超过n的时候,数据库阶段n之后的字符。

varchar(n): 变长数据类型,n为能存储的最大字节长度(取值范围1~8000),当存储字符占用字节少于n时,以实际使用为准;超过n时,截断。

这里为什么说n是来限定存储的字节呢?

原因在于当使用char或varchar来存储数据是:字符为因为字符,占一个字节;字符中文字符时,一个中文字符一般情况下占两个字节;要存入的字符为中英文混合时,按实际使用的字节计算。如‘中文ABC’存储占用字节为:2*2+3:。下面举个例子:

declare @var1 varchar(6), @var2 varchar(5);

set @var1='中文AB';

set @var2='中文AB';

select @var1, @var2;

执行结果如下:

|   未知列1    |    未知列2    |

---------------------------------------

|   中文AB     |    中文A       |

原因在于“中文AB”使用varchar类型来存储时占用字节为:2*2+2=6, 第二个varchar(5)限定了最长为5个字节所以会把超出部分截断,既‘B’丢失。

 

2、ncahr、nvarchar

nchar(n):  定长数据类型,存储字符为Unicode编码类型,每个字符占两个字节,n为能存储的最大字符数(取值范围1~4000【想想最大值为什么是4000?】),当存入字符数少于n的时候,末尾用空格不足。当存入字符数超过n的时候,数据库阶段n之后的字符。

nvarchar(n): 变长数据类型,存储字符为Unicode编码类型,每个字符占两个字节,n为能存储的最大字符数(取值范围1~4000),当存储字符占用字节少于n时,以实际使用为准;超过n时,截断。

同样以一个例子来说明,nvarchar(n)括号中的n指的是字符限定数。

declare @var1 nvarchar(4), @var2 nvarchar(3);

set @var1='中文AB';

set @var2='中文AB';

select @var1, @var2;

执行结果如下:

|   未知列1    |    未知列2    |

---------------------------------------

|   中文AB     |    中文A       |

 

二、使用情况:

【本段摘自http://www.cnblogs.com/ebaidu/archive/2007/08/14/854778.html 仅供学习使用】

很多开发者进行数据库设计的时候往往并没有太多的考虑char, varchar类型,有的是根本就没注意,因为存储价格变得越来越便宜了,忘记了最开始的一些基本设计理论和原则,这点让我想到了现在的年轻人,大手一挥一把人民币就从他手里溜走了,其实我想不管是做人也好,做开发也好,细节的把握直接决定很多东西。当然还有一部分人是根本就没弄清楚他们的区别,也就随便选一个。在这里我想对他们做个简单的分析,当然如果有不对的地方希望大家指教。

1、CHAR。CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充,所以在读取的时候可能要多次用到trim() 。

2、VARCHAR。存储变长数据 ,但存储效率没有CHAR高。 如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。为什么“+1”呢?这一个字节用于保存实际使用了多大的长度。 从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。

3、TEXT。text存储可变长度的非Unicode数据,最大长度为2^31-1(2,147,483,647)个字符。

4、NCHAR、NVARCHAR、NTEXT。这三种从名字上看比前面三种多了个“N”。它表示存储的是Unicode数据类型的字符。我们知道字符中,英文字符只需要一个字节存储就足够了,但汉字众多,需要两个字节存储,英文与汉字同时存在时容易造成混乱,Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。 nchar、 nvarchar的长度是在1到4000之间。和char、varchar比较起来,nchar、nvarchar则最多存储4000个字符,不论是英文还是汉字;而char、varchar最多能存储8000个英文,4000个汉字。可以看出使用nchar、nvarchar数据类型时不用担心输入的字符是英文还是汉字,较为方便,但在存储英文时数量上有些损失。

 

补充:char(n)在读取是知道字符串的长度,可以一次读出。而varchar(n)就像C语言中的字符串处理方式一样,在末尾用'\0'来表示结尾,所以不能一次性读出,需要一个一个字符读出才能知道在哪里结束。所以char类型的读取速度比varchar类型的读取速度快。


所以一般来说,如果含有中文字符,用nchar/nvarchar,如果纯英文和数字,用char/varchar
我把他们的区别概括成:
CHAR, NCHAR 定长,速度快,占空间大,需处理
VARCHAR,NVARCHAR,TEXT 不定长,空间小,速度慢,无需处理
NCHAR、NVARCHAR、NTEXT处理Unicode码 

【本段摘自http://wenku.baidu.com/view/eee97bf5f61fb7360b4c652b.html仅供学习使用】

varchar在SQL Server中是采用单字节来存储数据的,nvarchar是使用Unicode来存储数据的.中文字符存储到SQL Server中会保存为两个字节(一般采用Unico编码),英文字符保存到数据库中,如果字段的类型为varchar,则只会占用 一个字节 ,而如果字段的类型为nvarchar,则会占用 两个字节 . 
  正常情况下,我们使用varchar 也可以存储中文字符 ,但是如果遇到操作系统是英文操作系统并且对中文字体的 支持不全面时 , 在SQL Server存储中文字符为varchar就会出现乱码(显示为??).而且正常情况下,主机都会支持中文的环境,所以如果使用varchar来存储数据,在开发阶段是发现不了的.多数情况下,在布署的时候也不会有问题.
  但是!如果布署的主机是英文操作系统,并且不支持中文环境,那问题就出来了.所有的varchar字段在存储中文的时候都会变成乱码(显示为??).而且一般情况下你不会知道这是因为你采用了错误的数据类型来存储所造成的,你会试着去装中文字体,试着去设置操作系统的语言环境...这些都不能解决问题,唯一能解决问题的是把数据库字段的类型个性为nvarchar(或者nchar).对项目管理比较熟悉的朋友应该都知道,到布署阶段再来修改数据库是一个很恐怖的事情.
  使用nvarchar的另一个非常好处就是在判断字符串的时候可以不需要考虑中英文两种字符的差别.
  当然,使用nvarchar存储英文字符会增大一倍的存储空间.但是在存储代价已经很低廉的情况下,优先考虑兼容性会给你带来更多好处的.
  所以在Design的时候应该尽量使用nvarchar来存储数据.只有在你确保该字段不会保存中文的时候,才采用varchar来存储. 

补充:varchar(n)和nvarchar(n)都能处理中文,但是有些细节需要注意:当遇到中英文混合的情况时,varchar类型读取时会每个字节去判断到底是一个英文字符还是等待和下一个字节一起解析为一个中文字符,而nvarchar则不用,直接每次两个字节一起解析为一个Unicode字符。速度自己去体会了。

 

------------------------------------------------------------------------------------------------------------------------

总结:

1、varchar(n)括号中n限定的是能存储的最大字节数,nvarchar(n)括号中n限定的是能存储的最大字符数;

2、varchar和nvarcahr使用情形:在字符中全是英文时使用varchar,全是中文是使用nvarchar,中英文混合时推荐使用nvarchar。

3、char和varchar使用情形:注重读取效率时使用char(注意使用过程中要去除末尾空格),注重使用空间时使用varchar。
2 0
原创粉丝点击