CHAR(N),VARCHAR(N),NCHAR(N),NVARCHAR(N)是MSSQL的四种字符串数据类型,
都可以存储字符串但很多人都不清楚它们之间的区别,在选择字符
串类型的时候比较随意,很多时候造成了存储空间的浪费,那么它
们之间究竟有什么区别呢?
char [ ( n ) ]
固定长度字符数据类型,非 Unicode 字符数据,长度为 n 个字节。
n 的取值范围为 1 至 8,000,存储大小是 n 个字节。如果输入的
字符串长度不足N 则在右边用空格补足.
例:
declare @str char(5)
set @str='ab'
select @str
select DATALENGTH(@str)
/*
ab(三个空格)
----------------------
5
*/
varchar [ ( n | max ) ]
可变长度的字符数据类型,非 Unicode 字符数据。n 的取值范围为
1 至 8,000或者 max,max 指示最大存储大小是 2^31-1(2^31为的次方)个字节。
存储大小是输入数据的实际长度加 2 个字节。所输入数据的长度可以为 0 个字符。
例:
declare @str varchar(5)
set @str='ab'
select @str
select DATALENGTH(@str)
/*
ab(没有空格)
----------------------
2
*/
如果未在数据定义或变量声明语句中指定 n,则默认长度为 1。
如果在使用 CAST 和 CONVERT 函数时未指定 n,则默认长度为 30。
将为使用 char 或 varchar 的对象指派数据库的默认排序规则,
除非使用 COLLATE 子句指派了特定的排序规则。
该排序规则控制用于存储字符数据的代码页。
如果站点支持多语言,请考虑使用 Unicode nchar 或 nvarchar 数据类型,
以最大限度地消除字符转换问题。如果使用 char 或 varchar,建议执行以下操作:
如果列数据项的大小一致,则使用 char。
如果列数据项的大小差异相当大,则使用 varchar。
如果列数据项大小相差很大,而且大小可能超过 8,000 字节,请使用 varchar(max)。
当执行 CREATE TABLE 或 ALTER TABLE 时,如果 SET ANSI_PADDING 为 OFF,则定义为 NULL 的 char 列将作为 varchar 处理。
当排序规则代码页使用双字节字符时,存储大小仍然为 n 个字节。根据字符串的不同,n 个字节的存储大小可能小于 n 个字符。
字符数据类型(nchar 长度固定,nvarchar 长度可变)和 Unicode 数据使用 UNICODE UCS-2字符集。
nchar [ ( n ) ]
n 个字符的固定长度的 Unicode 字符数据。n 值必须在 1 到 4,000 之间(含)。
存储大小为两倍 n 字节。
例:
declare @str1 nchar(5)
set @str1='ab'
select @str1
select DATALENGTH(@str1)
/*
ab(三个空格)
---------------
10
*/
declare @str2 nchar(5)
set @str2='我爱你刘桦'
select @str2
select DATALENGTH(@str2)
/*
我爱你刘桦
------------------
10
*/
nvarchar [ ( n | max ) ]
可变长度 Unicode 字符数据。n 值在 1 到 4,000 之间(含)。
max 指示最大存储大小为 2^31-1 字节。存储大小是所输入字符个数的两倍 + 2 个字节。
所输入数据的长度可以为 0 个字符。
例:
declare @str1 nvarchar(5)
set @str1='ab'
select @str1
select DATALENGTH(@str1)
/*
ab(无空格)
---------------
4
*/
declare @str2 nvarchar(5)
set @str2='我爱你刘桦'
select @str2
select DATALENGTH(@str2)
/*
我爱你刘桦
------------------
10
*/
如果没有在数据定义或变量声明语句中指定 n,则默认长度为 1。如果没有使用 CAST 函数指定 n,则默认长度为 30。
如果列数据项的大小可能相同,请使用 nchar。
如果列数据项的大小可能差异很大,请使用 nvarchar。
sysname 是系统提供的用户定义数据类型,除了不可为空值外,
在功能上与 nvarchar(128) 相同。sysname 用于引用数据库对象名。
为使用 nchar 或 nvarchar 的对象分配的是默认的数据库排序规则,
但可使用 COLLATE 子句分配特定的排序规则。
SET ANSI_PADDING ON 永远适用于 nchar 和 nvarchar。SET ANSI_PADDINGOFF 不适用于 nchar 或 nvarchar 数据类型。
关于SET ANSI_PADDING的使用说明请参考:http://msdn.microsoft.com/zh-cn/library/ms187403(SQL.90).aspx