数据类型及其详解
在这里我收集了七大类数据类型,分别介绍如下:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
一 精确数字数据类型
精确数字数据类型用来存储没有小数位或有多个小数位的数值。使用任何算术运算符都可以操纵这些数据类型中存储的数值,而不需要任何特殊处理。精确数字数据类型的存储也是精确定义的。下表列出了SQL Server支持的精确数字数据类型。
表 精确数字数据类型
数据类型
|
存储
|
值域
|
作用
|
bigint
|
8
字节
|
-2E63
~
2E63-1
|
存储非常大的正负整数
|
int
|
4
字节
|
-2E31
~
2E31-1
|
存储正负整数
|
smallint
|
2
字节
|
-32 768
~
32 767
|
存储正负整数
|
tinyint
|
1
字节
|
0
~
255
|
存储小范围的正整数
|
decimal(p,s)
|
依据不同的精度,需要
5
~
17
字节
|
-10E38+1
~
10E38-1
|
最大可以存储
38
位十进制数
|
numeric(p,s)
|
依据不同的精度,需要
5
~
17
字节
|
-10E38+1
~
10E38-1
|
功能上等价于
decimal
,并可以与
decimal
交换使用
|
decimal和numeric数据类型接受参数来完成数据类型定义。这些参数定义数据类型的精度和小数位数。例如,decimal(12,4)定义了一个总共有12位数字的十进制值,其中小数点后面有4位数字。
在这组数据类型中,int和dedcimal是最常用的数据类型。使用decimal数据类型可以存储整型值,但这么做每行需要额外的存储字节,因此不要这么使用decimal数据类型。如果在一个列中打算存储的值的范围不超过32767,则通过使用smallint代替int,每行可以节省2个字节。如果取值范围只是在0和255之间,则通过使用tinyint数据类型,每行可以节省3个字节。
重要提示 空间利用率
每行节省2~3个字节的存储空间,相对于花几百元就能买到250 GB以上的硬盘来说并不算什么。然而,硬盘存储并不存在问题。如果在一个表中存储10万行数据(这是很常见的),则每行节省的字节总起来可达2~3 MB。虽然这个数字看上去没有什么,但考虑到如果用户执行一个返回该表中的所有行的查询,不仅可以节省同样多的内存空间,而且还可以节省上千个处理器周期。
如果把两个表连接起来,空间问题就更大了。把两个int列连接起来将消耗8个字节的内存空间,以及相应的处理器计算次数。如果两个表都有10万行数据,并且需要全部读出来,则该操作大约使用8 MB内存空间。如果把数据存储在一个smallint或tinyint列中,则本次查询可以节省4~6 MB内存,而且这仅仅是一次查询节省的内存。想想对该数据库执行几千次查询会出现的情况,就不难明白,每行由于使用了合适的数据类型而节约的1、2个字节,很快就能区分出性能良好的环境和性能低劣的环境。
二 近似数字数据类型
近似数字数据类型可以存储十进制值。然而,float或real数据类型中存储的数据,只能精确到数据类型定义中指定的精度。不能保证小数点右边的所有数字都被正确存储。例如,如果把1.00015454存储在一个定义为float(8)的数据类型中,则该列只能保证精确地返回1.000154。SQL Server存储数据时对小数点右边的数进行四舍五入。因此,涉及这些数据类型的计算,会出现舍入误差。在Intel处理器和AMD处理器之间传输包含涉及这些数据类型的表的数据库时,也会引入误差。下表列出了SQL Server支持的近似数字数据类型。
表 近似数字数据类型
数据类型
|
存储
|
取值范围
|
作用
|
float(p)
|
4
或
8
个字节
|
-2.23E308
~
2.23E308
|
存储大型浮点数,超过十进制数据类型的容量
|
real
|
4
个字节
|
-3.4E38
~
3.4E38
|
仍然有效,但为了满足
SQL-92
标准,已经被
float
替换了
|
float数据类型在定义时接受一个参数,该参数决定了精确存储的位数。例如,一个float(8)列精确存储7位数字,任何超过该数的位数都会遭遇舍入误差。
三 货币数据类型
货币数据类型旨在存储精确到4个小数位的货币值。下表列出了SQL Server支持的货币数据类型。
表 货币数据类型
数据类型
|
存储空间
|
取值范围
|
作用
|
money
|
8
字节
|
-922 337 203 685 477.5808
~
922 337 203 685 477.5807
|
存储大型货币值
|
smallmoney
|
4
字节
|
-214 748.3648
~
214 748.3647
|
存储小型货币值
|
在数据库中几乎不定义smallmoney数据类型,尽管对很多处理产品和订单的应用程序而言,这种数据类型是最精确的选择。由于不正确地使用了money数据类型,使每行数据浪费了4个字节的存储空间,这种情况是比较普遍的。
虽然money和smallmoney数据类型旨在存储货币值,但在金融应用程序中几乎不使用它们。相反,这些应用程序使用decimal数据类型,因为它们需要执行精确到6个、8个甚至12个小数位的计算。
四 日期和时间数据类型
在存储数据时,没有什么比确定日期和时间的存储方式更能引起争议了。一些应用程序只需存储日期,另一些应用程序只需存储时间,还有一些应用程序需要同时存储日期和时间。不幸的是,SQL Server只是把这类数据作为日期和时间存在一起——例如,2010-03-09 20:53:36.153。下表列出了SQL Server支持的日期和时间数据类型。
表 日期和时间数据类型
日期类型
|
存储空间
|
取值范围
|
作用
|
datetime
|
8
字节
|
从
January 1, 1753
到
December 31,9999
,精度为
3.33
毫秒
|
存储大型日期和时间值
|
smalldatetime
|
4
字节
|
从
January 1, 1900
到
June 6, 2079
,精度为
1
分钟
|
存储较小范围的日期和时间值
|
datetime和smalldatetime数据类型在计算机内部是作为整数存储的。datetime数据类型存储为一对4字节整数,它们一起表示自1753年1月1日午夜12点钟经过的毫秒数。前4个字节存储日期,而后4个字节存储时间。smalldatetime数据类型存储为一对2字节整数,它们一起表示自1900年1月1日午夜12点钟经过的分钟数。前两个字节存储日期,后两个日期存储时间。