在表中存储数据时,不同类型的数据占用的空间和存储的方式都不相同。接下来,我们就简单认识一下 DB2 中的各种数据类型(Data Type)。
DB2 主要分成两类数据类型:内置的数据类型和用户自定义的数据类型。本节只介绍内置类型,用户自定义类型在 3.17.2 节介绍。
内置数据类型主要包括数值型、文本型、日期时间型和 XML 四大类。
数值型具体划分如图 3.19 所示。
SMALLINT 称为小整型或短整型,是两个字节的整数,精度为 5 位,其数据表示范围从 -32,768 到 32,767。
INT 称为整型,也可以写成 INTEGER,是四个字节的整数,精度为 10 位,其数据表示范围从 -2,147,483,648 到 2,147,483,647。
BIGINT 称为大整型或长整型,是八个字节的整数,精度为 19 位,其数据表示范围从 9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。
REAL 称为单精度浮点数,是实数的 32 位近似值。数字可以为零,或者在从 -3.402E+38 到 -1.175E-37 或从 1.175E-37 到 3.402E+38 的范围内。
DOUBLE 称为双精度浮点数,是实数的 64 位近似值。数字可以为零,或者在从 -1.79769E+308 到 -2.225E-307 或从 2.225E-307 到 1.79769E+308 的范围内。
DECFLOAT 称为十进制浮点数,是 V9.5 中引入的新数据类型,适合于处理准确的十进制业务。它具有 DECIMAL 类型的准确性,同时又具有浮点数的性能优势,特别适合于在处理货币值相关的应用程序中使用。
DECIMAL 称为十进制数,是一种可以自己定义小数位数的压缩型十进制数,也可以写成 DEC,NUMERIC 或者 NUM,定义这种类型的数据需要指定两个参数:DECIMAL(p,s)。p 表示数字的总长度(不包括正负号和小数点),s 表示小数长度。
DECIMAL 类型的数据可以精确地表示指定精度的小数。它所占用的存储空间与第一个参数,即数字的总长度有关,计算公式为:tranc(p/2)+1。其中 tranc 表示截取整数部分。
字符型具体划分如 3.20 所示。
CHAR 称为定长字符串,需要指定长度,如 CHAR(10)。也可以写成 CHARACTER( 长度 )。定长字符串的长度介于 1 到 254 字节之间。如果没有指定长度,那么就认为是 1 个字节。
VARCHAR 称为变长字符串,需要指定最大长度,如 VARCHAR(20)。变长字符串长度的最大值是 32672。存储变长字符串时,需要额外花费 4 个字节来记录字符串的实际长度。所以,如果指定了 VARCHAR(20),每个这种类型的数据在硬盘上实际要占用 20+4=24 个字节的空间。
需要注意的是,对于变长字符串的实际占用存储空间量还有一个限制:数据必须适合放在单个表空间页面上。也就是说,对于使用 4K 页表空间的表,长度不能超过 4 × 1024-4=4092 字节;对于 8K 页表空间的表,长度不能超过 8 × 1024-4=8188 字节;对于 16K 页表空间的表,长度不能超过 16 × 1024-4=16380 字节;对于 32K 页表空间的表,长度不能超过 32 × 1024-4=32764 字节,但是该数超过了 VARCHAR 的最大长度 32672,所以对于 32K 页表空间的表,最大能够存放 32672 字节。默认情况下表空间为 4K,所以要使用 VARCHAR 类型来存储超过 4092 字节的数据,就需要显式创建更大页大小的表空间。
LONG VARCHAR 称为大型变长字符串,不需要指定最大长度,其最大可以存储 32700 个字节。与 VARCHAR 类型不同的是,该数据类型不受表空间页大小的限制,对于 4K 页表空间的表,长度可以超过 4092 字节,只要不超过 32700 字节即可。实际在硬盘上占用的存储空间为 ( 字符串长度 +24),24 个字节用于记录与该数值相关的信息。
CLOB 称为大对象字符串,需要指定长度,CLOB(n [K|M|G]),长度可以是字节,也可以是 K,M 或 G 等某一种单位,每个 CLOB 最大可以存储 2G 字节的数据。CLOB 数据并不是直接存放在表中,而是单独存放在一个表空间中,表中存放的是一个指针,指向对应的实际数据。
GRAPHIC,VARGRAPHIC,LONG GRAPHIC 和 DBCLOB 分别与前面的 CHAR,VARCHAR,LONG VARCHR 和 CLOB 对应,只是都存储双字节字符,存储的长度都减小一半。
BLOB 称为二进制大对象,也需要指定长度,BLOB(n [K|M|G]),长度可以是字节,也可以是 K,M 或 G 等某一种单位,每个 BLOB 最大可以存储 2G 字节的二进制数据。与 CLOB 一样,表中存放的也是指针,指向实际的数据。BLOB 适合于存放图片、音频、视频的容量非常大的内容,DB2 本身不考虑存放的内容是什么,只是按照二进制的方式将数据存放起来,使用的时候还需要配合相应的函数,对不同内容的数据进行不同的处理。
日期时间型包括 DATE,TIME 和 TIMESTAMP 三种。
DATE 称为日期型,能够表示的年份范围从公元 1 年到 9999 年中的任何一天,日期型数据显示出来是固定长度的 10 位字符串,在硬盘上存储需要占用 4 个字节,采用的是压缩字符串形式进行存储。
TIME 称为时间型,能够表示一天当中的时、分、秒,显示出来是固定长度的 8 位字符串,在硬盘上存储需要占用 3 个字节,采用的也是压缩字符串形式进行存储。
TIMESTAMP 称为时间戳型,能够表示年、月、日、时、分、秒,并且能够精确到微秒级别(具体能够精确到的位数还与计算机的硬件和操作系统有关)。
XML 是从 DB2 V9 开始引入的新的数据类型,能够直接把 XML 数据作为内容存储到表中,与以往把 XML 作为大对象存储不同的是,从 V9 开始,提供了 XQuery(类似于关系数据库中 SQL 的一种专门针对 XML 的查询语言)直接对 XML 这种层次型的数据进行各种操作,关于 XQuery 的简单介绍,请参见第 4 章。关于 XQuery 更详细的介绍,可以阅读本丛书的第二本《 DB2 深度解析——高级 DBA 和开发者篇》。
在 9.1 版本中,XML 数据是与表中数据分开存放的,XML 数据单独存放在一个表空间中,而从 9.5 版本开始,长度比较短的 XML 数据直接存放在表中,长度很长的 XML 数据单独存放在另外的表空间中,这样有利于提高查询效率。
在关系数据库中还存在一种特殊的类型:空值,用 Null 表示。如果一个值被设置为空值,表示该值不存在。空值可以放在任意的数据类型中来表示不存在。需要注意的是,空值不能参与任何的算术运算和逻辑运算。