5.2.2 数据类型
SQL语言是所有关系数据库通用的标准语言。Transact-SQL语言在标准SQL语言的基础上进行了功能上的扩充,Transact-SQL语言也有一些自己的特色,从而增加了用户对数据库操作的方便性和灵活性。
在SQL Server 2000中,每个变量、参数和表达式都有数据类型。所谓数据类型就是以数据的表现方式和存储方式来划分的数据的种类。SQL Server 2000中提供多种基本数据类型,如表5-2所示。
表5-2 SQL Server 2000的基本数据类型
其中,bigint和sql_variant是SQL Server 2000中新增的数据类型。另外,SQL Server 2000新增了table基本数据类型,该数据类型可用于存储SQL语句的结果集。table数据类型不适用于表中的列,而只能用于Transact-SQL变量和用户定义函数的返回值。
1.二进制数据类型
二进制数据类型用于存储二进制数据,包括binary型、varbinary型和image型。
1)binary型
binary型是固定长度的二进制数据类型,其定义形式为binary(n)。其中,n表示数据的长度,取值为1~8000。在使用时应指定binary型数据的大小,默认值为1字节。binary类型的数据占用n+4字节的存储空间。
在输入数据时,必须在数据前加上字符0X作为二进制标识。例如,要输入abc,则应输入0Xabc。若输入的数据位数为奇数,则系统会自动在起始符号0X的后面添加一个0。如上述输入0Xabc后,系统会自动变为0X0abc。
2)varbinary型
varbinary型是可变长度的二进制数据类型,其定义形式为varbinary(n)。其中,n表示数据的长度,取值为1~8000。如果输入的数据长度超出n的范围,则系统会自动截掉超出部分。
varbinary型具有变动长度的特性,因为varbinary型数据的存储长度为实际数值长度+4字节。当binary型数据允许null值时,将被视为varbinary型的数据。
一般情况下,由于binary型的数据长度固定,因此它比varbinary型的数据处理速度快。
3)image型
image型的数据也是可变长度的二进制数据,通常用于存放图像。其最大长度为231-1字节。
2.字符数据类型
字符数据类型是使用最多的数据类型,它可以用来存储各种字母、数字符号、特殊符号等。一般情况下,使用字符类型数据时,须在数据的前后加上单引号或双引号。字符数据类型包括char型、nchar型、varchar型和nvarchar型。
1)char型
char型是固定长度的非Unicode字符数据类型,在存储时每个字符和符号占用1字节的存储空间。其定义形式为char[(n)],其中n表示所有字符所占的存储空间,取值为1~8000,即可容纳8000个ANSI字符,默认值为1。若输入的数据字符数小于n定义的范围,则系统自动在其后添加空格来填满设定好的空间;若输入的数据字符数超过n定义的范围,则系统自动截掉超出部分。
2)nchar型
nchar型是固定长度的Unicode字符数据类型,由于Unicode标准规定在存储时每个字符和符号占用2字节的存储空间,因此nchar型的数据比char型数据多占用一倍的存储空间。其定义形式为nchar[(n)],其中n表示所有字符所占的存储空间,取值为1~4000,即可容纳4000个Unicode字符,默认值为1。
使用Unicode标准字符集的好处是由于它使用两个字节作存储单位,使得一个存储单位的容量大大增加,这样就可以将全世界的语言文字都囊括在内。当用户在一个数据列中同时输入不同语言的文字符号时,系统不会出现编码冲突。
3)varchar型
varchar型是可变长度的非Unicode字符数据类型。其定义形式为varchar[(n)]。它与char型类似,n的取值范围是1~8000。由于varchar型具有可变长度的特性,所以varchar型数据的存储长度为实际数值的长度。如果输入数据的字符数小于n定义的长度,系统也不会像char型那样在数据后面用空格填充;但是如果输入的数据长度大于n定义的长度,系统会自动截掉超出部分。
一般情况下,由于char型的数据长度固定,因此它比varchar型数据的处理速度快。
4)nvarchar型
nvarchar型是可变长度的Unicode字符数据类型,其定义形式为nvarchar[(n)]。由于它采用了Unicode标准字符集,因此n的取值范围是1~4000。nvarchar型的其他特性与varchar类型相似。
3.日期和时间数据类型
日期和时间数据类型代表日期和一天内的时间,包括datetime型和smalldatetime型。
1)datetime型
datetime型是用于存储日期和时间的结合体的数据类型。datetime型数据所占用的存储空间为8字节,其中前4字节用于存储1900年1月1日以前或以后的天数,数值分正负,正数表示在此日期之后的日期,负数表示在此日期之前的日期;后4字节用于存储从此日零时起所指定的时间经过的毫秒数。如果在输入时省略了时间部分,则系统将默认为12:00:00:000AM;如果省略了日期部分,系统将默认为1900年1月1日。
datetime型用于定义一个与采用24小时制并带有秒小数部分的一日内时间相组合的日期。日期范围为1753年1月1日到9999年12月31日,时间范围为00:00:00到23:59:59.997。通常,日期常量可用单引号定界。
例如:
declare @d datetime set @d='1980/11/1 5:20:29.121' select * from student where sBirthdate<@d
2)smalldatetime型
smalldatetime型与datetime型相似,但其存储的日期时间范围较小,从1900年1月1日到2079年6月6日。它的精度也较低,只能精确到分钟级,其分钟个位上的值是根据秒数并以30s为界四舍五入得到的。
Smalldatetime型数据所占用的存储空间为4字节,其中前2字节存储从基础日期1900年1月1日以来的天数,后2字节存储此日零时起所指定的时间经过的分钟数。
4.整数数据类型
整数型数据包括bigint型、int型、smallint型和tinyint型。
1)bigint型
bigint型数据的存储大小为8字节,共64位。其中63位用于表示数值的大小,1位用于表示符号。bigint型数据可以存储的数值范围是-263~263-1。
2)int型
int型数据的存储大小为4字节,共32位。其中31位用于表示数值的大小,1位用于表示符号。int型数据存储的数值范围是-231~231-1,即-2 147 483 648~2 147 483 647。
3)smallint型
smallint型数据的存储大小为2字节,共16位。其中15位用于表示数值的大小,1位用于表示符号。smallint型数据存储的数值范围是-215~215-1,即-32 768~32 767。
4)tinyint型
tinyint型数据的存储大小只有1字节,共8位,全部用于表示数值的大小,由于没有符号位,tinyint型的数据只能表示正整数。tinyint型数据存储的数值范围是-27~27-1,即-256~255。
5.浮点数据类型
浮点数据类型用于存储十进制小数。在SQL Server 2000中,浮点数值的数据采用上舍入的方式进行存储,也就是说,要舍入的小数部分不论其大小,只要是一个非零的数,就要在该数字的最低有效位上加1,并进行必要的进位。由于浮点数据为近似值,因此并非数据类型范围内的所有数据都能精确地表示。
浮点数据类型包括real型、float型、decimal型和numeric型。
1)real型
real型数据的存储大小为4字节,可精确到小数点后第7位。这种数据类型的数据存储范围为从-3.40E+38~-1.18E-38,0和1.18E-38~3.40E+38。
2)float型
float型的数据存储大小为8字节,可精确到小数点后第15位。这种数据类型的数据存储范围为从-1.79E+308~-2.23E-308,0和2.23E+308~1.79E+308。
float型的数据可写成float[(n)]的形式。其中n是1~15的整数值,指定float型数据的精度。当n为1~7时,实际上用户定义了一个real型的数据,系统用4字节存储;当n为8~15时,系统认为它是个float型的数据,用8字节存储它。这样既增强了数据定义的灵活性,又节省了空间。
3)decimal型
decimal数据类型和numeric数据类型的功能完全一样,它们都可以提供小数所需要的实际存储空间,但也有一定的限制,用户可以用2~17字节来存储数据,取值范围是-1038+1~1038-1。
decimal型数据和numeric型数据的定义格式为decimal[(p,[s])]和numeric[(p,[s])]。其中,p表示可供存储的值的总位数(不包括小数点),默认值为18;s表示小数点后的位数,默认值为0;参数之间的关系是0≤s≤p。例如,decimal(15,5)表示共有15位数,其中整数10位,小数5位。
6.逻辑数据类型
逻辑数据类型只有一种bit型。bit数据类型只占用1字节的存储空间,可以取值为1、0或NULL的整数数据类型。字符串值true和false可以转换为不同的bit值。true转换为1,false转换为0。非0数值转化为1。
例如下面的实例。
declare @a bit set @a='true' select @a
7.文本数据类型
文本数据类型是用于存储大量非Unicode和Unicode字符以及二进制数据的固定长度和可变长度数据类型,包括text型、ntext型。
1)text型
text型是用于存储大量非Unicode文本数据的可变长度数据类型,其容量理论上为231-1(2 147 483 647)字节。在实际应用时需要视硬盘的存储空间而定。
在SQL Server 2000以前的版本中,数据库中一个text对象存储的实际上是一个指针,它指向一个以8KB为单位的数据页。这些数据页是动态增加并被逻辑连接起来的。在SQL Server 2000中,则将text和image型的数据直接存放到表的数据行中,而不是存放到不同的数据页中。这样就减少了用于存储text和image类型的空间,并相应减少了磁盘处理这类数据的I/O数量。
2)ntext型
ntext型是用于存储大量Unicode文本数据的可变长度数据类型,其理论容量为230-1(1 073 741 823)字节。ntext型的其他用法与text型基本一样。
8.货币数据类型
货币数据类型用于存储货币或现金值,包括money型和smallmoney型。在使用货币数据类型时,应在数据前加上货币符号,以便系统辨识其为哪国的货币,如果不加货币符号,则系统默认为¥。
1)money型
money型是一个有4位小数的decimal值,其取值为-263~263-1,精确到货币单位的千分之十。存储大小为8字节。
2)smallmoney型
smallmoney型货币数据值为-2 147 483 648~+2 147 483 647,精确到货币单位的千分之十。存储大小为4字节。
例如,从表中读取数据赋予变量并显示,代码如下。
declare @a smallmoney select @a=jbgz from gz where id='1001' select @a