第4章数据类型教学目标理解数据类型的分类和主要的数据类型的特点,理解Unicode数据类型和大值数据类型4.1数据类型MicrosoftSQLServer2005系统提供了28种数据类型。这些数据类型可以分为数字数据类型、字符数据类型、日期和时间数据类型、二进制数据类型以及其他数据类型。展开数据库-可编程性-类型4.1.1数字数据类型使用数字数据的数据类型被称为数字数据类型。这些数据类型的数字可以参加各种数学运算。精确数字(1)bigint,int,smallint,tinyint整型常量以没有用引号括起来并且不包含小数点的数字串来表示。integer常量必须全部为数字;它们不能包含小数。Eg:12,-324(2)bit可以取值为1、0或NULL的整数数据类型。字符串值TRUE和FALSE可以转换为以下bit值:TRUE转换为1,FALSE转换为0。bit常量使用数字0或1表示,并且不括在引号中。如果使用一个大于1的数字,则该数字将转换为1。--验证bit类型的使用(1)创建表testcreatetabletest(colabit)(2)向表test中插入数据insertintotestvalues(123)insertintotestvalues(-123)insertintotestvalues(-0.123)insertintotestvalues(0)(3)查看表test中的数据select*fromtest(3)decimal和numeric由整数和小数部分构成,所有的数字都是有效位,能够以完成的精度存储十进制。2者等价。表达方式:decimal(p,s)ornumeric(p,s)其中:p代表精度,表示可以存储数据的总位数,包括小数点左边和右边的位数。范围为1-38,默认为18;s代表小数点右边数字的个数,范围0~p,默认为0.例如:Decimal(5,2):表示数据共5个数字,小数点后面2位,则小数点前面有(5-2)3位。能表示的最大数据为999.99。Eg:createtabletest(adecimal(5,2))insertintotestvalues(32.456);insertintotestvalues(59.9);insertintotestvalues(1000);分析:存储到数据库中的数据。(4)money和smallmoney代表货币值的数据类型常量前面可以带有$,例如$12.34createtabletest(amoney)insertintotestvalues($32.456);insertintotestvalues(59900);select*fromtestdroptabletest近似数字类型用于表示浮点数值数据的近似数值数据类型。浮点数据为近似值,因此,并非数据类型范围内的所有值都能精确地表示。float和real常量使用科学记数法来表示。101.5E50.5E-24.1.2datetime和smalldatetime数据类型常量使用特定格式的字符日期值来表示,并被单引号括起来。例如:createtabletest(adatetime)insertintotestvalues('100315');insertintotestvalues('20100315')insertintotestvalues('2010-03-15')insertintotestvalues('2010/03/15')select*fromtestinsertintotestvalues('2010/03/158:8:8')insertintotestvalues('2010/03/1521:18:58')droptabletest4.1.3字符数据类型字符数据类型用于存储固定长度或可变长度的字符数据。在MicrosoftSQLServer2005系统中,提供了char、varchar、text、nchar、nvarchar、ntext等6种数据类型。前3种数据类型是非Unicode字符数据,后3种是Unicode字符数据(1)Char、varchar和text固定长度或可变长度的字符数据类型。char[(n)]固定长度,非Unicode字符数据,长度为n个字节。n的取值范围为1至8,000,存储大小是n个字节。eg:char(5)如果数据没有达到定义长度时,系统自动补空格。varchar[(n|max)]可变长度,非Unicode字符数据。n的取值范围为1至8,000。max指示最大存储大小是2^31-1个字节。存储大小是输入数据的实际长度加2个字节。所输入数据的长度可以为0个字符。Text同varchar(max)相同,表示8000个字符以上的字符串。未来版本将要取消此类型。注意:(1)如果未在数据定义或变量声明语句中指定n,则默认长度为1(2)如果列数据项的大小一致,则使用char。(3)如果列数据项的大小差异相当大,则使用varchar。(4)如果列数据项大小相差很大,而且大小可能超过8,000字节,请使用varchar(max)。字符串常量字符串常量括在单引号内并包含字母数字字符(a-z、A-Z和0-9)以及特殊字符,如感叹号(!)、at符(@)和数字号(#)。如果单引号中的字符串包含一个嵌入的引号,可以使用两个单引号表示嵌入的单引号。对于嵌入在双引号中的字符串则没有必要这样做。以下是字符串的示例:'Cincinnati''O''Brien''ProcessXis50%complete.''Thelevelforjob_id:%dshouldbebetween%dand%d.'(2)ncharnvarcharntext例如,有一个必须处理三种主要语言的北美洲客户的数据库:墨西哥使用的西班牙语名称和地址魁北克使用的法语名称和地址加拿大其余地区和美国使用的英语名称和地址当只使用字符列和代码页时,必须小心以确保与数据库一起安装的代码页能处理所有这三种语言的字符。另外,还必须小心保证当运行某种语言的代码页的客户端读取另一种语言的字符时,能够正确转换字符。支持国际化客户端的数据库应始终使用Unicode数据.Unicode是统一字符编码标准,为了数据库中存储多国语言而制定。存储Unicode数据时每个字符使用2个字节,而不是每个字符1个字节。nchar[(n)]n个字符的固定长度的Unicode字符数据。n值必须在1到4,000之间(含)。nvarchar[(n|max)]可变长度Unicode字符数据。n值在1到4,000之间(含)。max指示最大存储大小为2^31-1字节。存储大小是所输入字符个数的两倍+2个字节。所输入数据的长度可以为0个字符。常量Unicode字符串的格式与普通字符串相似,但它前面有一个N标识符createtabletest1(achar(3))insertintotest1values('ab')insertintotest1values('我们')createtabletest2(anchar(3))insertintotest2values('ab')insertintotest2values(N'我们');select*fromtest1select*fromtest2droptabletest1droptabletest24.1.4二进制数据类型二进制类型用于存储声音、图片或者多媒体数据。包括binary、varbinary、image等3种数据类型。在MicrosoftSQLServer2005系统中,微软公司建议使用varbinary(max)代替image数据类型常量二进制常量具有前辍0x并且是十六进制数字字符串。这些常量不使用引号括起。例:0x12Ef0x69048AEFDD010E0x(emptybinarystring)4.1.5其他数据类型除了前面介绍的数据类型之外,MicrosoftSQLServer2005系统还提供了cursor、sql_variant、table、timestamp、uniqueidentifier、xml等数据类型。使用这些数据类型可以完成对特殊数据对象的定义、存储和使用。(1)timestamp公开数据库中自动生成的唯一二进制数字的数据类型。timestamp通常用作给表行加版本戳的机制。存储大小为8个字节。注意(1)timestamp的列名可省(2)一个表中只能有一个timestamp类型的列(3)对行的任何更新都会更改timestamp值Eg:createtabletest(aint,btimestamp);insertintotest(a)values(1);insertintotest(a)values(2);insertintotest(a)values(3);修改数据updatetestseta=4wherea=1观察timestamp列值的变化select*fromtestdroptabletest(2)uniqueidentifier创建一个uniqueidentifier类型的唯一值。createtabletest(GuidColuniqueidentifier,NumColint)insertintotestValues(NEWID(),4)select*fromtest4.2用户自定义数据类型用户自定义数据类型是基于sqlserver基本数据类型构造的。当几个表中必须存储同一种数据类型并且需要有相同的长度和可空性时,可以使用自定义数据类型。创建自定义数据类型时,必须给定3个参数:数据类型的名称,基类型,是否为空(1)在SSMS中自定义类型展开数据库-可编程性-类型-右击用户定义类型打开如下窗口:(2)通过系统存储过程系统存储过程sp_addtype可用来创建用户自定义数据类型,语法如下:Sp_addtype新数据类型名,系统数据类型,是否为空是否唯恐必须用单引号引起来,如’null’,’notnull’例:创建一个uname用户自定义数据类型,基类型为变长为8的字符串。sp_addtypeuname,'varchar(8)','notnull'删除用户自定义类型(1)(2)Sp_droptype数据类型名例如:sp_droptypeuname数据类型的转换函数ConvertCast使用方法:【例】如何得到上个月的最后一天思路:(1)先得到当月第一天convert(char(7),getdate(),111)+'/01'(2)再将得到的字符串转换成日期时间后减1selectconvert(datetime,convert(char(7),getdate(),111)+'/01')-1总结:精确数字bigintdecimalintnumericsmallintmoneytinyintsmallmoneybit近似数字floatreal日期和时间datetimesmalldatetime字符串chartextvarcharUnicode字符串ncharntextnvarchar二进制字符串binaryimagevarbinary其他数据类型cursortimestampsql_variantuniqueidentifiertablexml