`
lushuaiyin
  • 浏览: 674787 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

实例分析varchar和nvarchar的区别--【叶子】

 
阅读更多
一、整体介绍

1varchar(n)

(1) 长度为n个字节的可变长度且非Unicode的字符数据。

(2) n 必须是一个介于18,000之间的数值。

(3) 存储大小为输入数据的字节的实际长度,而不是n个字节。

2nvarchar(n)

(1) 包含n个字符的可变长度Unicode字符数据。

(2) n 的值必须介于14,000之间。

(3) 字节的存储大小是所输入字符个数的两倍。

二、实例分析

我们首先定义两个不同类型的字符串,来看一下他们的字符数和字节数:

DECLARE @sql_one varchar(200)

SET @sql_one='China中国Beijing北京Olympics奥林匹克'

DECLARE @sql_two nvarchar(200)

SET @sql_two='China中国Beijing北京Olympics奥林匹克'

select dbo.[chinesecount_new]( @sql_two)

SELECT DATaLENGTH(@sql_one) '@sql_one字节数',

LEN(@sql_one) '@sql_one字符数',

DATaLENGTH(@sql_two) '@sql_two字节数',

LEN(@sql_two) '@sql_two字符数'

/*结果

@sql_one字节数@sql_one字符数@sql_two字节数@sql_two字符数

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

36 28 56 28

*/

/*在这里我谈一下自己的体会(跟原创无关)

字符--我们看到的一个文字就是一个字符,无论是英文字母还是汉字,都是一个字符。

字节--在计算机中存储的单位。

我们写的文字,或从数据库读出的文字,可是直观的知道是几个字符(你数一数就知道了),

但是字节我们无法直观的知道,因为怎么存的不知道。

比如这个例子中,‘China中国Beijing北京Olympics奥林匹克' ,

这句话就有28个字符,其中有20个英文字母,8个汉字。

而要知道具体存到数据库占用了多少字节,那就要看用哪种方式存储了。

varcher方式,一个英文字符占1字节,一个汉字占2字节,所以结果就是20+8*2=36;

nvarcher方式,无论什么字符都占2字节,所以结果就是(20+8)*2=56;

说白了,nvarcher的最小存储单位是2字节,这样你就不用管存的到底你存的是英文还是中文,

都是1比2的关系,我们在程序里调用字符串长度函数就知道结果了。

要是用varcher,到底占多少,你还要统计一下,你的数据里有多少英文,有多少中文。

这个有点难。

*/

三、误区分析

如果varchar(n)中n的范围是1~8000,而nvarchar(n)中n的范围是1~4000,是不是varchar就比nvarchar存放的多呢,当然不是。

DECLARE @one varchar(10)

SET @one='忽如一夜春风来千树万树梨花开'

DECLARE @two nvarchar(10)

SET @two='忽如一夜春风来千树万树梨花开'

SELECT @one 'varchar', @two 'nvarchar'

/*结果

varchar nvarchar

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

忽如一夜春 忽如一夜春风来千树万

*/

我们可以清楚地看到 varchar(10)只能放5个汉字,而nvarchar(10)能放10个

也就是说varchar(8000)和nvarchar(4000)存放的汉字的最大上限是一样的。

如果是字母或是数字就不一样了!

DECLARE @one varchar(10)

SET @one='abcdefghijklmn'

DECLARE @two nvarchar(10)

SET @two='abcdefghijklmn'

SELECT @one 'varchar', @two 'nvarchar'

/*结果

varchar nvarchar

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

abcdefghij abcdefghij

*/

四、使用规则

由于varchar(n)是非Unicode 的数据类型,而nvarchar(n)是Unicode 的数据类型。所以如果是纯字母和数字的字符串用varchar,而有汉字或是韩文的用nvarchar。这样既可以不影响效果,有最大限度的避免了乱码。

注:Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

© 【叶子】http://blog.csdn.net/maco_wang原创作品,转贴请注明作者和出处,留此信息。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics