在计算机中数据有两种
特征:类型和长度。所谓数据类型就是以数据的表现方式和存储方式来划分的数据的种类。
SQL Server 中每个变量、参数、表达式等都有数据类型。系统提供的数据类型分为几大类,如表4-2 所示。

其中,BIGINT SQL_VARIANT TABLE SQL Server 2000 中新增加的3 种数据类型。下面分类讲述各种数据类型。

一、 整数数据类型
整数数据类型是最常用的数据类型之一。
1
INT INTEGER
INT
(或INTEGER)数据类型存储从-231次方 (-2 147 483 648) 到231次方-1 2 147 483647) 之间的所有正负整数。每个INT 类型的数据按4 个字节存储,其中1 位表示整数值的正负号,其它31 位表示整数值的长度和大小。
2
SMALLINT
SMALLINT
数据类型存储从-215次方( -32 768) 到215次方-1 32 767 )之间的所有正负整数。每个SMALLINT 类型的数据占用2 个字节的存储空间,其中1 位表示整数值的正负号,其它15 位表示整数值的长度和大小。
3
TINYINT
TINYINT
数据类型存储从0 255 之间的所有正整数。每个TINYINT类型的数据占用1 个字节的存储空间。
4
BIGINT
BIGINT
数据类型存储从-2^63 -9 223 372 036 854 775 807) 到2^63-1 9 223 372 036 854 775 807) 之间的所有正负整数。每个BIGINT 类型的数据占用8个字节的存储空间。

二、 浮点数据类型
浮点数据类型用于存储十进制小数。浮点数值的数据在SQL Server 中采用上舍入(Round up 或称为只入不舍)方式进行存储。所谓上舍入是指,当(且仅当)要舍入的数是一个非零数时,对其保留数字部分的最低有效位上的数值加1 ,并进行必要的进位。若一个数是上舍入数,其绝对值不会减少。如:对3.14159265358979 分别进行2 位和12位舍入,结果为3.15 3.141592653590
1
REAL 数据类型
REAL
数据类型可精确到第7 位小数,其范围为从-3.40E -38 3.40E +38。 每个REAL类型的数据占用4 个字节的存储空间。
2
FLOAT
FLOAT
数据类型可精确到第15 位小数,其范围为从-1.79E -308 1.79E +308。 每个FLOAT 类型的数据占用8 个字节的存储空间。 FLOAT数据类型可写为FLOAT[ n ]的形式。n 指定FLOAT 数据的精度。n 115 之间的整数值。当n 1 7 时,实际上是定义了一个REAL 类型的数据,系统用4 个字节存储它;当n 8 15 时,系统认为其是FLOAT 类型,用8 个字节存储它。
3
DECIMAL
DECIMAL
数据类型可以提供小数所需要的实际存储空间,但也有一定的限制,您可以用2 17 个字节来存储从-1038次方-1 1038次方-1 之间的数值。可将其写为DECIMAL[ p [s] ]的形式,p s 确定了精确的比例和数位。其中p 表示可供存储的值的总位数(不包括小数点),缺省值为18 s 表示小数点后的位数,缺省值为0。 例如:decimal 15 5),表示共有15 位数,其中整数10 位,小数5。 位表4-3 列出了各精确度所需的字节数之间的关系。

4
NUMERIC
NUMERIC
数据类型与DECIMAL数据类型完全相同。
注意:SQL Server 为了和前端的开发工具配合,其所支持的数据精度默认最大为28位。但可以通过使用命令来执行sqlserver.exe程序以启动SQL Server,可改变默认精度。命令语法如下:SQLSERVR[/D master_device_path][/P precisim_leve1]
4-4: 用最大数据精度38 启动SQL Server
sqlservr /d c:\ Mssql2000\data\master.dat /p38
/*
在使用了/P 参数后,如果其后没有指定具体的精度数值,则默认为38 ./*

三、二进制数据类型
1
BINARY
BINARY
数据类型用于存储二进制数据。其定义形式为BINARY n), n 表示数据的长度,取值为1 8000 。在使用时必须指定BINARY 类型数据的大小,至少应为1 个字节。BINARY 类型数据占用n+4 个字节的存储空间。在输入数据时必须在数据前加上字符“0X” 作为二进制标识,如:要输入“abc ”则应输入“0xabc ”。若输入的数据过长将会截掉其超出部分。若输入的数据位数为奇数,则会在起始符号“0X ”后添加一个0,如上述的“0xabc ”会被系统自动变为“0x0abc”
2
VARBINARY
VARBINARY
数据类型的定义形式为VARBINARYn)。 它与BINARY 类型相似,n 的取值也为1 8000,若输入的数据过长,将会截掉其超出部分。不同的是VARBINARY数据类型具有变动长度的特性,因为VARBINARY数据类型的存储长度 为实际数值长度+4个字节。当BINARY数据类型允许NULL 值时,将被视为VARBINARY数据类型。
一般情况下,由于BINARY 数据类型长度固定,因此它比VARBINARY 类型的处理速度快。

四、 逻辑数据类型
BIT
BIT数据类型占用1 个字节的存储空间,其值为0 1 。如果输入0 1 以外的值,将被视为1 BIT 类型不能定义为NULL 值(所谓NULL 值是指空值或无意义的值)。

五、字符数据类型
字符数据类型是使用最多的数据类型。它可以用来存储各种字母、数字符号、特殊符号。一般情况下,使用字符类型数据时须在其前后加上单引号或双引号
1 CHAR
CHAR
数据类型的定义形式为CHAR[ n) 。 以CHAR 类型存储的每个字符和符号占一个字节的存储空间。n 表示所有字符所占的存储空间,n 的取值为1 8000, 即可容纳8000 ANSI 字符。若不指定n 值,则系统默认值为1。若输入数据的字符数小于n,则系统自动在其后添加空格来填满设定好的空间。若输入的数据过长,将会截掉其超出部分。
2
NCHAR
NCHAR
数据类型的定义形式为NCHAR[ n]。 它与CHAR 类型相似。不同的是NCHAR数据类型n 的取值为1 4000。 因为NCHAR 类型采用UNICODE 标准字符集(CharacterSet)。 UNICODE 标准规定每个字符占用两个字节的存储空间,所以它比非UNICODE 标准的数据类型多占用一倍的存储空间。使用UNICODE 标准的好处是因其使用两个字节做存储单位,其一个存储单位的容纳量就大大增加了,可以将全世界的语言文字都囊括在内,在一个数据列中就可以同时出现中文、 英文、法文、德文等,而不会出现编码冲突。
3
VARCHAR
VARCHAR
数据类型的定义形式为VARCHARn)。 它与CHAR 类型相似,n 的取值也为1 8000,若输入的数据过长,将会截掉其超出部分。不同的是,VARCHAR数据类型具有变动长度的特性,因为VARCHAR数据类型的存储长度为实际 数值长度,若输入数据的字符数小于n ,则系统不会在其后添加空格来填满设定好的空间。
一般情况下,由于CHAR 数据类型长度固定,因此它比VARCHAR 类型的处理速度快。
4
NVARCHAR
NVARCHAR
数据类型的定义形式为NVARCHAR[ n ]。 它与VARCHAR 类型相似。不同的是,NVARCHAR数据类型采用UNICODE 标准字符集(Character Set), n 的取值为1 4000

六、文本和图形数据类型
这类数据类型用于存储大量的字符或二进制数据。
1
TEXT
TEXT
数据类型用于存储大量文本数据,其容量理论上为1 231次方-1 2 147 483 647)个字节,在实际应用时需要视硬盘的存储空间而定。
SQL Server 2000
以前的版本中,数据库中一个TEXT 对象存储的实际上是一个指针,它指向一个个以8KB 8192 个字节)为单位的数据页(Data Page)。 这些数据页是动态增加并被逻辑链接起来的。在SQL Server 2000 中,则将TEXT IMAGE 类型的数据直接存放到表的数据行中,而不是存放到不同的数据页中。 这就减少了用于存储TEXT IMA- GE 类型的空间,并相应减少了磁盘处理这类数据的I/O 数量。
2 NTEXT
NTEXT
数据类型与TEXT.类型相似不同的,NTEXT 类型采用UNICODE 标准字符集(Character Set), 因此其理论容量为230-1(1, 073, 741, 823)个字节。
3 IMAGE
IMAGE
数据类型用于存储大量的二进制数据Binary Data。其理论容量为231次方-1(2,147,483,647)个字节。其存储数据的模式与TEXT 数据类型相同。通常用来存储图形等OLE Object Linking and Embedding,对象连接和嵌入)对象。在输入数据时同BINARY数据类型一样,必须在数据前加上字符“0X”作为二进制标识

七、 日期和时间数据类型
1 DATETIME
DATETIME
数据类型用于存储日期和时间的结合体。它可以存储从公元1753 1 1 日零时起到公元9999 12 31 23 59 59 秒之间的所有日期和时间,其精确度可达三百分之一秒,即3.33 毫秒。DATETIME 数据类型所占用的存储空间为8 个字节。其中前4 个字节用于存储1900 1 1 日以前或以后的天数,数值分正负,正数表示在此日期之后的日期,负数表示在此日期之前的日期。后4 个字节用于存储从此日零时起所指定的时间经过的毫秒数。如果在输入数据时省略了时间部分,则系统将12:00:00:000AM作为时间缺省值:如果省略 了日期部分,则系统将1900 1 1 日作为日期缺省值。
2 SMALLDATETIME
SMALLDATETIME
数据类型与DATETIME 数据类型相似,但其日期时间范围较小,为从1900 1 1 日到2079 6 6:日精度较低,只能精确到分钟,其分钟个位上为根据秒数四舍五入的值,即以30 秒为界四舍五入。如:DATETIME 时间为14:38:30.283
SMALLDATETIME 认为是14:39:00 SMALLDATETIME 数据类型使用4 个字节存储数据。其中前2 个字节存储从基础日期1900 1 1 日以来的天数,后两个字节存储此日零时起所指定的时间经过的分钟数。
下面介绍日期和时间的输入格式
日期输入格式
日期的输入格式很多大致可分为三类:

*
英文+数字格式
此类格式中月份可用英文全名或缩写,且不区分大小写;年和月日之间可不用逗号;
年份可为4 位或2 位;当其为两位时,若值小于50 则视为20xx 年,若大于或等于50
视为19xx 年;若日部分省略,则视为当月的1号。以下格式均为正确的日期格式:
June 21 2000 Oct 1 1999 January 2000 2000 February
2000 May 1 2000 1 Sep 99 June July 00
*
数字+分隔符格式
允许把斜杠(/)、连接符(-)和小数点(.)作为用数字表示的年、月、日之间的分
隔符。如:
YMD
2000/6/22 2000-6-22 2000.6.22
MDY
3/5/2000 3-5-2000 3.5.2000
DMY
31/12/1999 31-12-1999 31.12.2000
*
纯数字格式
纯数字格式是以连续的4 6、位或8 位数字来表示日期。如果输入的是6 位或8
数字,系统将按年、月、日来识别,即YMD 格式,并且月和日都是用两位数字来表示:
如果输入的数字是4 位数,系统认为这4 位数代表年份,其月份和日缺省为此年度的1
1
日。如:
20000601---2000
6 1 991212---1999 12 12 1998---1998 ????

时间输入格式
在输入时间时必须按小时、分钟、秒、毫秒的顺序来输入。在其间用冒号隔开。但可将毫秒部分用小数点“.” 分,隔其后第一位数字代表十分之一秒,第二位数字代表百分之一秒,第三位数字代表千分之一秒。当使用12 小时制时用AMam PMpm)分别指定时间是午前或午后,若不指定,系统默认为AMAM PM 均不区分大小写。如:
3:5:7.2pm---
下午3 5 7 200 毫秒
10:23:5.123Am---
上午10 23 5 123 毫秒
可以使用SET DATEFORMAT 命令来设定系统默认的日期-时间格式。

八、货币数据类型
货币数据类型用于存储货币值。在使用货币数据类型时,应在数据前加上货币符号,系统才能辨识其为哪国的货币,如果不加货币符号,则默认为。各货币符号如图4-2所示。
1 MONEY
MONEY
数据类型的数据是一个有4 位小数的DECIMAL 值,其取值从-263次方(-922337203685477.5808263次方-1+922337203685 477.5807),数据精度为万分之一货币单位。MONEY 数据类型使用8个字节存储。

2 SMALLMONEY
SMALLMONEY
数据类型类似于MONEY 类型,但其存储的货币值范围比MONEY数据类型小,其取值从-214,748.3648+214,748.3647,存储空间为4 个字节。

九、 特定数据类型
SQL Server
中包含了一些用于数据存储的特殊数据类型。
1 TIMESTAMP
TIMESTAMP
数据类型提供数据库范围内的惟一值此类型相当于BINARY8VARBINARY8),但当它所定义的列在更新或插入数据行时,此列的值会被自动更 新,一个计数值将自动地添加到此TIMESTAMP数据列中。每个数据库表中只能有一个TIMESTAMP数据列。如果建立一个名为 “TIMESTAMP”的列,则该列的类型将被自动设为TIMESTAMP数据类型。
2 UNIQUEIDENTIFIER
UNIQUEIDENTIFIER
数据类型存储一个16 位的二进制数字。此数字称为(GUIDGlobally Unique Identifier ,即全球惟一鉴别号)。此数字由SQLServer NEWID函数产生的全球惟一的编码,在全球各地的计算机经由此函数产生的数字不会相同。

十、用户自定义数据类型
SYSNAME SYSNAME
数据类型是系统提供给用户的,便于用户自定义数据类型。它被定义为NVARCHAR128),即它可存储128UNICODE字符或256个一般字符。其具体使用方法请参见第7管理数据库表中的自定义数据类型章节。

十一、 新数据类型
SQL Server 2000
中增加了3 种数据类型:BIGINTSQL_VARIANTTABLE。其中BIGINT数据类型已在整数类型中介绍,下面介绍其余两种:
1 SQL_VARIANT
SQL_VARIANT
数据类型可以存储除文本、图形数据(TEXTNTEXTIMAGE)和TIMESTAMP类型数据外的其它任何合法的SQL Server数据。此数据类型大大方便了SQL Server的开发工作。
2 TABLE
TABLE
数据类型用于存储对表或视图处理后的结果集。这一新类型使得变量可以存储一个表,从而使函数或过程返回查询结果更加方便快、捷其、使用请参见第13游标、视图和自定义函数

最后再附一张对照表
序号
类别
SQL
C#
备注
1
整数
bit
Boolean
True转换为1False转换为0
2
tinyint
Byte
C#数据类型都位于System命名空间
3
smallint
Int16
4
int
Int32
5
bigint
Int64
6
smallmoney
decimal
7
money
decimal
8
numeric
decimal
9
decimal
decimal
10
浮点数
float
double
11
real
single
12
日期和时间
smalldatetime
datetime
13
datetime
datetime
14
timestamp
datetime
15
字符串
char
string
16
text
string
17
varchar
string
18
nchar
string
19
ntext
string
20
nvarchar
string
21
二进制数据
binary
Byte[]
22
varbinary
Byte[]
23
p_w_picpath
Byte[]
24
其他
uniqueidentifier
guid
25
variant
object
 
SQL Server 2005的数据类型与SQL 2000有一些不同,在创建表时,列的数据类型需要注意几点
  • varchar(max)代替textvarchar的最大长度为8000,但是varchar(max)则可以存储多达2G的数据,因此其作用相当于SQL 2000中的text。但是微软可能会后续的SQL Server版本中移除text类型,从现在就应该用varchar(max) 来代替text
  • nvarchar(max)代替ntext,用binary(max)代替p_w_picpath.
  • XML数据选择xml类型。在SQL Server 2005中,为XML数据添加了相应的数据类型,因此存储XML数据的列不需要用varchar(max)nvarchar(max),而应当用xml数据类型,以利用T-SQL中专门针对xml数据列的新命令,以及针对xml列的索引。