一、整体介绍
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
*/
三、误区分析
如果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(统一码、万国码、单一码)是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。