SQL Server表中的每一个字段都只能包含一个预先指定的特定数据类型,例如字符或数字。这个声明叫做数据类型。在这篇文章里,我们将比较和对照SQL Server 2008的各种数据类型。此外,我们还将展示各种特定环境下哪种数据类型是最好的解决方法。在SQL Server 2008中有超过35种的不同数据类型。
分类
Microsoft将各种数据类型分为以下7种大的分类:精确数字、大约数字、日期和时间、字符串、Unicode字符串、二进制字符串和其它数据类型。
数字
有两种数字分类:精确数字和大约数字。
精确数字包括Real和Float类型。在一般情况下,当需要科学符号时使用精确数字。科学符号是一种使用10的幂数来描述非常大或非常小的数字的方法(也称作指数符号)。
精确数字包括Decimals(小数)、Integers(整数)和Money amounts(货币值)。
一个Integer是一个没有小数或分数的计算数值。所有的负数、正数和零都是整数。SQL Server将整数分为四个部分:
BigInt:从-9,223,372,036,854,775,808到9,223,372,036,854,775,807
Int:从-2,147,483,648到2,147,483,648
SmallInt:从-32,768到32,767
TinyInt: 从0到255
正确地设置大小为Int类型而不是将所有都设置为BigInt是有两个主要的原因的。首先是物理磁盘空间。对于BigInt来说每条记录占据8个字节,而Int只使用两个字节。另一个原因是确保你的应用程序只接收到它所预期的数据大小,从而避免了出现缓冲溢出的现象。
具有小数的精确数字包括Decimal、Numeric、Money和SmallMoney数据类型。Decimal和Numeric类型功能上是一样的。就是说,它们的使用、计算和行为都是一样的,唯一的不同就是在数学定义上而不是SQL Server使用它们的方法上。大多数SQL Server应用程序使用Decimal。一个Decimal的长度最多可以达到38位。当定义了Decimal,它的总长度和右侧的小数点部分的最大长度也就被配置了。定义的位数越多,每条记录上使用的物理磁盘空间就越多。
Money和SmallMoney是小数点后固定的有四位的小数。SmallMoney的值可以从- 214,748.3648到214,748.3647,而Money值的范围是从-922,337,203,685,477.5808到922,337,203,685,477.5807。使用Money而不是一个Decimal的一个原因是可以选择在三位数后显示美元符号和逗号。
字符串
这一节将开始讨论字符串:Char、VarChar和Text。一个Char(字符)数据类型可以保存字母、数字和键盘字符。当定义了一个Char时,它的最大长度(可以达到8,000)就也固定了。想想一个Char可以将你能输入到记事本中的所有东西保存住——而且就像记事本,如果你输入数字到一个Char字段,那么不能对它们执行数学操作。它们会被看做是文本字符,而不是数字。一般情况下,当输入每一条记录的字符数目都大致相同时,例如一个邮编货电话号码,这时就使用Char字段。如果数据的长度是每条记录都很不一样时,例如一个邮件地址,那么使用VarChar。一个VarChar是一个长度可变的Char(Var)。当创建了一个VarChar时,它的最大长度就也被定义了。使用VarChar而不是Char的一个主要原因是各自使用的物理磁盘空间的数量。在下面的例子里,创建了一个具有一个Char字段和一个VarChar字段的表。它们都设置为大小最大为50.
图1
给每一个输入相同的测试数据。
图2
下面的TSQL返回物理磁盘上的字节空间数目,按行和列的形式。
SELECT DATALENGTH(ColChar) AS CharSize, DATALENGTH(ColVarChar) AS VarSize
FROM table1
图3
所以无论输入的数据是大是小,对于每一条记录Char字段都使用50个字节。
VarChar的另一个好处是可以指定不限制大小的能力。这是通过使用“Max”关键字来完成的,如同在VarChar(Max)中一样。Max意味着大小可以超过8,000字节。此外,这个大小是不限制的。
最后一个字符串类型的是Text数据类型。Text和VarChar(Max)字段类似。它目前包括在SQL Server 2008之中只用于向后兼容,在未来某个时候它将被废弃。
Unicode
Unicode是一个标准的方法,它允许应用程序记录其它语言的字符而不仅仅是我们自己的。当你建立多语言应用程序或全球web网站时,Unicode就很方便了。Char和VarChar数据类型都可以配置为允许Unicode,只要在它们之前加个字母“n”,如同nChar和nVarChar。这个灵活性的代价在于增大了磁盘空间的使用。大略估计,Unicode所需的磁盘空间大概是两倍。
二进制字符串
二进制字符串是用于保存非字符的数据,例如图片或媒体文件。有两种数据类型用于此:Binary和VarBinary。它们的配置就像Char和VarChar。VarBinary(Max)可以用来存储不限制大小的文件。还有一个遗留数据类型叫做Image,但是它在SQL Server的未来版本中将不再出现。
其它数据类型
有7个其它的数据类型,包括Cursor、HierachyID、SQL Variant、Table、TimeStamp、UniqueIdentifier和XML。数据类型TimeStamp被RowVersion取代了。UniqueIdentifier是一个独特的GUID。当你不知道要用什么数据类型时可以使用SQL Variant数据类型。它存储任何东西都是8,000个字节。如果你使用XML,那么使用XML数据类型而不要使用一个VarChar。XML类型允许绑定到集合上。
日期和时间
SQL Server 2008包含新的日期和时间数据类型。
总结
在SQL Server 2008中有超过35种的不同数据类型。如果你的应用程序需要比较或管理不同数据类型的字段,那么可以使用Cast和Convert函数。例如一个包含数字的Char字段可以转换为一个Int,然后就可以对它进行数学操作了。
-------------------------------
字段类型 描述
bit 0或1的整型数字
int 从-2^31(-2,147,483,648)到2^31(2,147,483,647)的整型数字
smallint 从-2^15(-32,768)到2^15(32,767)的整型数字
tinyint 从0到255的整型数字
decimal 从-10^38到10^38-1的定精度与有效位数的数字
numeric decimal的同义词
money 从-2^63(-922,337,203,685,477.5808)到2^63-1(922,337,203,685,477.5807)的货币数据,最小货币单位千分之十
smallmoney 从-214,748.3648到214,748.3647的货币数据,最小货币单位千分之十
float 从-1.79E+308到1.79E+308可变精度的数字
real 从-3.04E+38到3.04E+38可变精度的数字
datetime 从1753年1月1日到9999年12日31的日期和时间数据,最小时间单位为百分之三秒或3.33毫秒
smalldatetime 从1900年1月1日到2079年6月6日的日期和时间数据,最小时间单位为分钟
timestamp 时间戳,一个数据库宽度的唯一数字
uniqueidentifier 全球唯一标识符GUID
char 定长非Unicode的字符型数据,最大长度为8000
varchar 变长非Unicode的字符型数据,最大长度为8000
text 变长非Unicode的字符型数据,最大长度为2^31-1(2G)
nchar 定长Unicode的字符型数据,最大长度为8000
nvarchar 变长Unicode的字符型数据,最大长度为8000
ntext 变长Unicode的字符型数据,最大长度为2^31-1(2G)
binary 定长二进制数据,最大长度为8000
varbinary 变长二进制数据,最大长度为8000
image 变长二进制数据,最大长度为2^31-1(2G)