
4.2.2 数据类型
数据类型是指数据所代表信息的类型,如数值型、字符型、日期型、货币型、图像型等。用户使用的数据类型与SQL Server 2005系统在内存或磁盘上开辟的存储空间大小密切相关。因此,在使用数据之前,先要定义其数据类型。SQL Server 2005中支持系统数据类型和用户自定义数据类型。
SQL Server 2005提供了丰富的系统数据类型,表4.5列出了SQL Server 2005支持的系统数据类型。
表4.5 SQL Server 2005支持的系统数据类型

(1)字符型。
字符型数据类型用于存储由字母、数字和符号组成的字符串。SQL Server提供了char、varchar和text三种类型。其中,char用于存储长度固定的字符串,varchar用于存储长度可变的字符串,text用于存储无限长的字符串(每行可达2GB)。
对于定长字符数据类型,用char(n)来表示,n表示指定定长字符串的长度。若实际存储的字符串长度不足n时,则字符串的尾部用空格填充;若输入长度大于n时,则超出的部分被截去。
对于变长字符数据类型,用varcher(n)来表示,n表示的是字符串可达到的最大长度。存储大小是输入数据的实际长度。
当实际的字符数据长度接近一致时,可以使用char;而当字符数据的长度差别显著不同时,使用varchar更合适,能节省存储空间。
(2)Unicode字符型。
Unicode(统一字符编码标准)用于支持国际上非英语语种的字符数据的存储和处理。SQL Server的Unicode字符型可以存储Unicode标准字符集定义的各种字符。
Unicode字符型数据类型有nchar[(n)]、nvarchar[(n)]和ntext三类。nchar[(n)]是包含n个字符的固定长度的Unicode字符数据。若输入字符串长度不足n,则将以空白字符补足。nvarchar[(n)]为最多包含n个字符的可变长度的Unicode字符数据。ntext类型可以存储的数据范围是0~(231-1)字节。
实际上,nchar、nvarchar、ntext与char、varchar、text的使用非常相似,只是字符集不同。前者使用Unicode字符集,后者使用ASCII字符集。
(3)二进制字符型。
二进制字符型是指数据由二进制值组成。SQL Server提供了三种二进制数据类型,即binary、varbinary和image。其中,binary用于存储固定长度的二进制数据,varbinary用于存储可变长度的二进制数据,image用于存储大的二进制数据,如存储照片、图片或图画。
输入二进制数据时,在数据前面要加上“0x”,可用的数字符号为0~9,A~F(不区分大小写)。
(4)整型。
整型数据类型包括bigint、int、smallint、tinyint四类。从标识符的含义可以看出,它们的数值范围逐渐缩小,最常用的是int。
(5)精确数值型。
精确数值型数据由整数部分和小数部分构成,其所有的数字都是有效位,能够以完整的精度存储十进制数。精确数值型数据类型包括decimal和numeric两类,从功能上说两者完全等价。最常用的是numeric类型。
(6)近似数值型。
近似数值型数据类型有浮点型(float)和实型(real)两类。real的存储长度为4字节,可以用real数据类型存储正的或负的十进制数值。float如果不指定其长度,它会占用8字节的存储空间。用户可以指定float型数值的长度。当指定长度为1~7时,则定义了一个real数据类型。
(7)日期和时间型。
日期和时间型是指用datetime和smalldatetime类型来存储日期和时间数据。两者占用的空间和取值范围不同,而数据格式是完全相同的。默认情况下,输入格式为“月/日/年”。
(8)货币型。
货币型数据类型包括money和smallmoney两类,它们用十进制数表示货币,当输入货币型数据时,必须在数据前面加上货币表示符号($),且数据中间不能有逗号(,);若货币为负数,则需要在符号前加上负号(-)。
(9)其他数据类型。
①bit(位)数据类型。bit(位)数据类型有0和1两种取值,长度为1字节。输入0以外的其他值时,系统都把它们当作1对待。这种数据类型常作为逻辑变量使用,用来表示真、假(或是、否等)二值选择。
②cursor数据类型。cursor数据类型是变量或存储过程output参数的一种数据类型,这些参数包含对游标的引用。使用cursor数据类型创建的变量可以为空。
③timestamp数据类型。timestamp数据类型提供数据库范围内的唯一值,反映数据库中数据修改的相对顺序,相当于一个自动增加的计数器。当它所定义的列在更新或插入数据行时,该列的值自动增加。
④XML数据类型。利用它可以将XML实例存储在表列中或者XML类型的变量中。
⑤table数据类型。table数据类型用于存储对表或视图处理后的结果集。这种数据类型使得变量可以存储一个表,从而使函数或过程返回查询结果更加方便、快捷。
⑥sql_variant数据类型。sql_variant数据类型用于存储除文本、图形数据和timestamp类型数据外的任何合法的SQL Server数据,从而方便了SQL Server的开发工作。
⑦uniqueidentifier数据类型。uniqueidentifier数据类型用于存储一个16字节长的二进制数据,它是SQL Server根据计算机网卡地址和CPU时钟产生的全局唯一标识符,该数字由SQL Server的newid()函数获得。在全球各地的计算机经由此函数产生的数字都不会相同。
用户自定义数据类型是建立在SQL Server系统数据类型的基础上的,可以看作是系统数据类型的别名。当用户自定义一种数据类型时,需要指定该类型的名称、建立在其上的系统数据模型以及是否允许为空值等。用户自定义数据类型后,自定义数据类型的使用和系统数据类型一样。
有两种方法可建立用户自定义数据类型。一种是通过对象资源管理器,另一种则是利用系统存储过程建立。下面仅介绍通过对象资源管理器建立用户自定义数据类型的过程,以创建一个名为zgh、基于char数据类型、不允许为空值的用户自定义数据类型为例。
在“对象资源管理器”中展开要建立用户自定义数据类型的数据库,右击“类型”,然后单击“新建”—“用户定义数据类型”(如图4.10所示)。

图4.10 创建用户自定义数据类型
在弹出的对话框中,输入新建数据类型的名称(zgh),并在“数据类型”下拉列表中选择所基于的系统数据类型(char),在“长度”对应的输入框中更改该数据类型可存储的最大数据长度,其他可根据需要一一进行修改(如图4.11所示)。

图4.11 用户自定义数据类型属性对话框
如果要删除用户自定义数据类型,可右击该数据类型,然后单击“删除”,在“删除对象”对话框内选中对象名称,单击“确定”按钮,完成删除用户自定义数据类型。