1、varchar(n)
(1) 长度为n个字节的可变长度且非Unicode的字符数据。
(2) n 必须是一个介于1和8,000之间的数值。
(3) 存储大小为输入数据的字节的实际长度,而不是n个字节。
2、nvarchar(n)
(1) 包含n个字符的可变长度Unicode字符数据。
(2) n 的值必须介于1与4,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原创作品,转贴请注明作者和出处,留此信息。