在进行数据库设计的时候,表机构的设计是至关重要的一部分,还有一部分可能往往容易被轻视,那就是数据类型的选择。前一篇中讲到了一点点数据类型,这章具体讲讲,下面的文章不是我写的,是摘自与Oracle编程艺术里的。(部分地方稍微做了修改)
~~~~~~~~~~~~~~~~~~~~~~~~~~~华丽的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
选择一个正确的数据类型,这看上去再容易不过了,但我屡屡见得选择不当的情况。要选择什么类型来存储你的数据,这是一个最基本的决定,而且这个决定会在以后的数年间影响着你的应用和数据。选择适当的数据类型至关重要,而且很难事后再做改变,也就是说,一旦选择某些类型实现了应用,在相当长的时间内就只能“忍耐”(因为你选择的类型可能不太合适)。
这一章我们将介绍Oracle 所有可用的基本数据类型,讨论这些类型如何实现,并说明每种类型分别适用于哪些情况。在此不讨论用户定义的数据类型,因为用户定义的数据类型只是由Oracle 内置数据类型导出的一些复合对象。我们会分析如果不合适地使用了错误的数据类型,甚至只是对数据类型使用了不正确的参数(如长度、精度、小数位等),将会发生什么情况。读完这一章后,你将对使用哪些类型有所了解,明白这些类型如何实现以及何时使用,还有很重要的一点,你会认识到为什么关键是要针对具体任务使用适宜的类型。
Oracle 数据类型概述
Oracle 提供了22 种不同的SQL 数据类型供我们使用。简要地讲,执行数据类型如下:- CHAR:这是一个定长字符串,会用空格填充来达到其最大长度。非null 的CHAR(12.)总是包含12.字节信息(使用了默认国家语言支持National Language Support,NLS 设置)。稍后将更详细地介绍NLS 的作用。CHAR 字段最多可以存储2,000 字节的信息。
- NCHAR:这是一个包含UNICODE格式数据的定长字符串。Unicode 是一种对字符进行编码的通用方法,而不论使用的是何种计算机系统平台。有了NCHAR 类型,就允许数据库中包含采用
- VARCHAR2:目前这也是VARCHAR 的同义词。这是一个变长字符串,与CHAR 类型不同,它不会用空格填充至最大长度。VARCHAR2(12.)可能包含0~12.字节的信息(使用默认NLS 设置)。
- VARCHAR2 最多可以存储4,000 字节的信息。
- NVARCHAR2:这是一个包含UNICODE 格式数据的变长字符串。NVARCHAR2(12.)可以包含0~12.字符的信息。NVARCHAR2 最多可以存储4,000 字节的信息。
- RAW:这是一种变长二进制数据类型,这说明采用这种数据类型存储的数据不会发生字符集转换。可以把它看作由数据库存储的信息的二进制字节串。这种类型最多可以存储2,000 字节的信息。
- NUMBER:这种数据类型能存储精度最多达38 位的数字。这些数介于12.0×12.(-130)— —(但不包括)12.0×12.(126)之间。每个数存储在一个变长字段中,其长度在0(尾部的NULL 列就是0字节)~22 字节之间。Oracle 的NUMBER类型精度很高,远远高于许多编程语言中常规的FLOAT和DOUBLE 类型。
- BINARY_FLOAT:这是Oracle 10g Release 1 及以后版本中才有的一种新类型。它是一个32位单精度浮点数,可以支持至少6 位精度,占用磁盘上5 字节的存储空间。
- LONG:这种类型能存储最多2G 的字符数据(2GB 是指2 千兆字节,而不是2 千兆字符,因为在一个多字节字符集中,每个字符可能有多个字节)。由于LONG 类型有许多限制(后面会讨578/ 849论),而且提供LONG 类型只是为了保证向后兼容性,所以强烈建议新应用中不要使用LONG 类型,而且在现有的应用中也要尽可能将LONG 类型转换为CLOB 类型。
- LONG RAW:LONG RAW 类型能存储多达2GB 的二进制信息。由于LONG 同样的原因,建议在将来的所有开发中都使用CLOB 类型,另外现有的应用中也应尽可能将LONG RAW 转换为BLOB 类型。
- DATE:这是一个7 字节的定宽日期/时间数据类型。其中总包含7 个属性,包括:世纪、世纪中哪一年、月份、月中的哪一天、小时、分钟和秒。
- TIMESTAMP:这是一个7 字节或12.字节的定宽日期/时间数据类型。它与DATE 数据类型不同,因为TIMESTAMP 可以包含小数秒(fractional second);带小数秒的TIMESTAMP 在小数点右边最多可以保留9 位。
- TIMESTAMP WITH TIME ZONE:与前一种类型类似,这是一个12.字节的定宽TIMESTAMP,不过它还提供了时区(TIME ZONE)支持。数据中会随TIMESTAMP 存储有关时区的额外信息,所以原先插入的TIME ZONE 会与数据一同保留。
- TIMESTAMP WITH LOCAL TIME ZONE:与TIMESTAMP 类似,这是一种7 字节或12.字节的定宽日期/时间数据类型;不过,这种类型对时区敏感(time zone sensitive)。如果在数据库中有修改,会参考数据中提供的TIME ZONE,根据数据库时区对数据中的日期/时间部分进行“规范化”。所以,如果你想使用U.S./Pacific 时区插入一个日期/时间,而数据库时区为U.S./Eastern,最后的日期/时间信息会转换为Eastern 时区的日期/时间,并像TIMESTAMP 一样存储。获取这个数据时,数据库中存储的TIMESTAMP 将转换为会话时区的时间。INTERVAL YEAR TO MONTH:这是一个5 字节的定宽数据类型,用于存储一个时间段,这个类型将时段存储为年数和月数。可以在日期运算中使用这种时间间隔使一个DATE 或TIMESTAMP类型增加或减少一段时间。
- INTERVAL DAY TO SECOND:这是一个12.字节的定宽数据类型,用于存储一个时段,这个类型将时段存储为天/小时/分钟/秒数,还可以有最多9 位的小数秒。BFILE:这种数据类型允许在数据库列中存储一个Oracle 目录对象(操作系统目录的一个指针)和一个文件名,并读取这个文件。这实际上允许你以一种只读的方式访问数据库服务器上可用的操作系统文件,就好像它们存储在数据库表本身中一样。
- BLOB:在Oracle9i 及以前的版本中,这种数据类型允许存储最多4GB 的数据,在Oracle 10g及以后的版本中允许存储最多(4GB)×(数据库块大小)字节的数据。BLOB 包含不需要进行字符集转换的“二进制“数据,如果要存储电子表格、字处理文档、图像文件等就很适合采用这种数据类型。
- CLOB:在Oracle9i 及以前的版本中,这种数据类型允许存储最多4GB 的数据,在Oracle 10g及以后的版本中允许存储最多(4GB)×(数据库块大小)字节的数据。CLOB 包含要进行字符集转换的信息。这种数据类型很适合存储纯文本信息。
- NCLOB:在Oracle9i 及以前的版本中,这种数据类型允许存储最多4GB 的数据,在Oracle 10g及以后的版本中允许存储最多(4GB)×(数据库块大小)字节的数据。NCLOB 存储用数据库国家字符集编码的信息,而且像CLOB 一样,这些信息要进行字符集转换。
- ROWID:ROWID 实际上是数据库中一行的12.字节地址。ROWID 中编码有足够的信息,足以在磁盘上定位这一行,以及标识ROWID 指向的对象(表等)。
- UROWID:UROWID 是一个通用ROWID,用于表(如IOT 和通过异构数据库网关访问的没有固579/ 849定ROWID 的表)。UROWID 是行主键值的一种表示,因此,取决于所指向的对象,UROWID 的大小会有所变化。