6.1.1 SQL Server的数据类型

6.1.1 SQL Server的数据类型

在数据表中为每一列选择合适的数据类型尤为重要,因为它影响着系统的空间利用、性能、可靠性和是否易于管理等特性。因此,在开发一个数据库系统之前,应该真正理解各种数据类型的存储特征。表6.4列出了SQL Server支持的所有数据类型,读者可以对它们有一个总体上的印象。

表6.4 SQL Server支持的系统数据类型

img157

1.整数型

整数如15,0, -361238,无小数部分。整数型包括bigint、int、smallint和tinyint,它们表示的数值大小范围逐渐缩小,其精度(即存储的十进制数据的总位数)和长度(所占用的空间字节数)由长变短。

(1)bigint:大整数型,整数范围为 -263 (-9 223 372 036 854 775 808) ~263-1 (9

2

23 372 036 854 775 807) ,其精度为19位,长度为8字节。

(2)int:整数型,整数范围为 -231 (-2 147 483 648) ~231-1 (2 147 483 647) ,其精度为10位,长度为4字节。

(3)smallint:短整数型,整数范围为 -215 (-32768) ~215-1 (32767) ,其精度为5位,长度为2字节。

(4)tinyint:微整数型,整数范围为 0~255,其精度为3,长度为1字节。

2.小数数据类型

由整数部分和小数部分组成,如-3.456,63.558,也叫做十进制数据类型,它包括numeric和decimal两类,可以精确指定小数点两边数据的总位数(精度,precision简写为p)和小数点右边的位数(刻度,scale简写为s),可以表示为numeric(p,s)和decimal(p,s)。

例如数据3890.587的精度是7,小数位数是3,适合它的类型为numeric(7,3)或decimal(7,3)。如果把它存储到numeric(5,1)或decimal(5,1)类型中,则实际存储为3890.5。如果要把它存储到numeric(4,1)或decimal(4,1)类型中,则会产生报错信息。因此某列为小数数据类型时,其列类型定义中必须使整数部分位数不小于该列中全部可能数据的整数部分的位数。

在SQL Server中,numeric数据类型是decimal数据类型的同义词。decimal可以简写为dec。

decimal和numeric型数据的最高精度的可以达到38位,即1≤p≤38,0≤s≤p。也就是说数据的取值范围必须在-1038+1~1038-1之间。

SQL Server分配给decimal和numeric型数据的存储长度随精度的不同而不同,对应的比例关系如下:

① 精度范围1~9,分配存储字节数为5。

② 精度范围10~19,分配存储字节数为9。

③ 精度范围20~28,分配存储字节数为13。

④ 精度范围29~38,分配存储字节数为17。

3.近似数值型

并非所有的数据都能在计算机中精确地表示,它们所保留的精度由二进制数据系统的精度决定,float和real用来表示一些近似数值数据,该数值与实际数据之间可能存在一个微小的差别,对于多数应用场合而言,这一差别可以忽略,特别是一些非常大且对精度要求不是十分高的统计量。按照科学记数法“尾数E阶数”来表示数据, 如3.1416×1023表示为3.1416E23。近似数值型也叫浮点型。

(1)real:使用4字节存储数据,数据范围为-3.40E + 38 到 3.40E + 38,数据精度为7位有效数字。

(2)float[(n)]:使用4字节或8字节存储数据,数据范围从-1.79E+308~1.79E+308。定义中的n取值范围是1~53,用于存储科学记数法中尾数的位数。当n的取值为1~24时,float型数据可以达到的精度是7位,用4个字节来存储等效于real型。当n的取值范围是25~53时,float型数据可以达到的精度是15位,用8个字节来存储,这也是默认情况。

4.货币型

货币数据类型专门用于货币数据处理。SQL Server中对货币数据的存储精确度为4位小数点,精确到万分之一货币单位。

(1)money:数范围为-263 (-922337203685477.5808)~263-1 (922337203685477.5807) ,其精度为19位,存储长度为8字节。

(2)smallmoney:数范围为 –231 (-2,147,48.3648) ~231-1 (2,147,48.3647) ,其精度为10位,存储长度为4字节。

在把值输入到定义为money或smallmoney数据类型的表列时,应该在最高位之前放一个货币符号$,但是也没有严格要求。对于负数要写成$-123.4567的形式。

5.位型

SQL Server中的位(bit)型数据相当于其他语言中的逻辑型数据,它只存储0、1或null,长度为一个字节。当输入0或1以外的其他值系统均视为1。 当一个表中有1~8个的bit列时,SQL Server将这些列作为一个字节存储,有9~16个的bit列时,按两个字节存储,依此类推。

6.字符型

字符型数据用于存储字符串,如‘祝你成功!’,‘abc@163.com’等。字符串中可包括字母、汉字、数字和其他特殊符号(如#、@、&等)。

(1)char(n):使用固定长度来存储字符串,每个字符占用一个字节的存储空间, n表示字符个数,可以为1~8000,即最长可容纳8000个字符。利用char数据类型来定义列或者定义变量时,应该按数据可能的最大长度来定义。如果实际数据的字符长度短于给定的最大长度,则多余的字节会用空格填充。如果实际数据的字符长度超过了给定的最大长度,则超过的字符将会被截断。

(2)varchar(n):使用可变长度来存储字符串,使用方式与char数据类型类似,最长可以达到8000字符的变长字符。与char 数据类型不同的是,varchar数据类型的存储空间随存储在表列中的每一个数据的字符数目的不同而变化。

例如,定义“地址”列为varchar(50)时,那么存储在该列的数据最多可以长达50个字节。但是在数据没有达到50个字节时并不会在多余的字节上填充空格。

当存储在某列中的字符长度相差甚远时,使用varchar数据类型可以有效地节省空间。

(3) text:当要存储的字符型数据非常庞大以至于8000字节完全不够用时,char和varchar数据类型都失去了作用,这时应该选择text数据类型。

text数据类型专门用于存储数量庞大的变长字符数据。最大长度可以达到231-1个字符,约2GB。定义text数据类型不必指定长度,SQL Server系统自动以16表示长度,并且按实际字符长度自动分配空间。

7.Unicode字符型

Unicode是“统一字符编码标准”,用于支持国际上各种非英语语种的字符数据的存储和处理,可以存储由Unicode标准定义的任何字符(包含不同字符集定义的所有字符),它实际上是双字节数据类型。SQL Server共有3类Unicode字符型,它们是nchar、nvarchar和ntext,使用方法分别对应于char、varchar和text。如一个汉字使用char类型要占用2字符位(2个字节),使用nchar只需要1个字符位(2个字节)。

(1)nchar[(n)]:是包含n个字符的固定长度的 Unicode 字符型数据,n 的值在 1 与4 000 之间,默认为1。由于存储的都是双字节字符,所以存储空间为2n字节。

(2)nvarchar[(n)]: 为最多包含n个字符的可变长度的 Unicode 字符型数据,n 的值在 1 与 4 000之间,默认为1,所以使用nvarchar数据类型所能存储的最大字符数也是4000。

(3)ntext: 可表示最大长度为 230 - 1 (1,073,741,823) 个Unicode字符,其数据的存储长度是实际字符个数的两倍。

8.日期时间数据类型

日期时间数据类型可以存储日期和时间的组合数据。如‘2000-05-08 12:35:01PM’,‘4/15/2007 18:35:01’都是有效的日期时间数据。SQL Server提供了一系列专门处理日期和时间的函数来处理这类数据。如果使用字符型数据来存储日期和时间,只有用户本人可以识别,计算机并不能识别,因而也不能自动将这些数据按照日期和时间进行处理。

日期时间数据类型共有Datetime和Smalldatetime两类。

(1)datetime :范围从1753年1月1日到9999年12月31日,精确度为百分之三秒(等于 3.33 毫秒或 0.00333 秒)。Datetime数据类型的数据占用8个字节的存储空间。

(2)smalldatetime: 范围从1900年1月1日到2079年6月6日,可以精确到分。smalldatetime数据类型占4个字节的存储空间。

SQL Server在用户没有指定时间数据时,会自动设置datetime和smalldatetime数据的时间为00:00:00。

img158 日期部分可以使用数字格式、字母格式和无分隔符格式三种。

①使用数字格式:

如果语言设置为简体中文,默认按ymd(年月日)形式接受日期数据,年月日之间分隔符有两种:连字符(-)、斜杠(/)。如输入“2003-6-5”或“2003/6/5”都表示2003年6月5日。

如果语言设置为us_english,默认按mdy(月日年)形式接受日期数据,年月日之间可以用3种分隔符:连字符(-)、斜杠(/)、 或句点(.)。输入“03-06-2005” 或“03/06/2005”或“03.06. 2005”都表示2005年3月6日。

使用SET DATEFORMAT ymd命令可以改变日期格式的接受形式为ymd。日期顺序参数包括mdy、dmy、ymd、ydm、myd 和 dym共6种。

②使用字母格式:

用Jan、Feb等英文字母来表示月份时,则可以用年月日的6种组合方式接受数据。如:Apr 15 2007, 15 Apr 2007都表示2007年4月15日。

③无分隔符格式:

可以使用4、6、8位数字表达日期。如果只使用4位数字则只表示年份;使用6、8位时,月日都必须用两位。如“2007”表示2007年1月1日,“070405”和“20070405”表示2007年4月5日。

img159 时间部分的表示格式如下:

时:分 14:30

时:分:秒 14:20:20

时:分:秒:毫秒 14:20:20:200

时:分AM|PM 10:30AM  4PM  用12小时制

9.二进制数据类型

二进制数据类型表示的是位数据流,包括binary , varbinary和image。

(1)binary[(n)] :列数据在每行中都是固定长度,n从1~8000,最多为8KB。

(2)varbinary[(n)]: 列数据在每行中可以是不同的长度,n从1~8000,最多为8KB。

(3)image :可以用来储存超过8KB的可变长度的二进制数据,最大长度可以达到231-1个字符,约2GB。如word文档、excel电子表格、图像等。

10.其他数据类型

uniqueidentifier:用于产生一个全局唯一标识符即GUID(Globally Unique Identification Numbers),是一个16字节的二进制数。它根据计算机网络适配器地址和主机CPU时钟产生的唯一号码,可以通过newid()函数获得。

timestamp:时间戳数据类型,当向表中插入或修改行数据时,它可以反映数据库中数据修改的相对顺序。

cursor :游标数据类型,主要用于创建游标变量,不能赋值给表的字段。

sql_variant :用于储存除了text、ntext、timestamp类型以外的值。

table:用于暂存一些行的结果集。