天天看点

Oracle中常用的数据类型

整理自《OCP认证指南》

001

    当建表时,每一列都分配一种数据类型,它决定了可以插入该列的值的特性。这些数据类型也用来指定PL/SQL过程和函数的参数的特性。在选择数据类型时,必须考虑要保存的数据和要在它上面执行的操作。空间也是需要考虑的事项:有些数据类型是固定长度的,不管其中是什么数据,都占用相同的字节数;有些数据类型的长度则是可变的。如果没有填充列,那么Oracle根本不会给它提供任何空间。如果后面更新行来填充列,那么行会变得更大,而不管数据类型是固定长度还是可变长度。

002    

下面的数据类型适合于字母数字数据:

    varchar2 可变长度的字符数据,从1B到4KB。数据保存在数据库字符集中。

    nvarchar2 和varchar2一样,但数据保存在国家语言字符集(它是许可的unicode字符集之一)中。

    char 固定长度的字符数据,从1B到2KB,它保存在数据库字符集中。如果数据不够列的长度,就会用空格进行填充。

    注意:为了符合ISO/ANSI,可以指定varchar数据类型,但这种类型的所有列都会自动转换为varchar2。

003 

    下面的数据类型适合于数字数据,它们都是可变长度的:

    number 数字数据,可以指定它的精度和小数位数。精度范围是1-38,小数位数范围是从-84到127.

    float 这是一个ANSI数据类型,精度为126位二进制、38位十进制的浮点数。Oracle还提供binary_float和binary_double作为备选。

    integer 相当于number,小数位数为0.

004 下面的数据类型适用于日期和时间数据,它们都是固定长度的:

    date 它的长度为0(如果列为空)或者7个字节。所有date数据都包含世纪、年、月、日、时、分和秒。其有效范围为公元前4712年1月1日至公元9999年12月31日。

    timestamp 如果列为空,那么它的长度为0,或者达到11字节(这取决于指定的精度)。与date类似,但对秒而言,其精度最多为9位,默认为6位。

    timestamp with timezone 和timestamp一样,但在保存数据时可以指定时区。根据精度,长度可能达到13个字节。该数据类型让Oracle通过将两个时区规范化为UTC来确定它们之间的差,即使这两个时间在不同的时区。

    timestamp with local timezone 和timestamp一样,但数据在保存时被规范化为数据库时区。当检索时,将其规范化为选择它的用户进程所在的时区。

    interval year to month 用于记录两个date或timestamp之间以年和月为单位的时间间隔。

    interval day to second 用于记录两个date或timestamp之间以天和秒为单位的时间间隔。

005 下面是大对象数据类型:

    CLOB 保存在数据库字符集中的字符数据,大小没有限制:4GB乘以数据库块的大小。

    NCLOB 和CLOB一样,但数据保存在可选的国家语言字符集(它是许可的unicode字符集之一)中。

    BLOB 和CLOB一样,但二进制数据不会被Oracle Net执行字符集转换。

    BFILE 定位器,它指向保存在数据库服务器的操作系统上的文件。文件的大小限制为4GB。

    LONG 数据库字符集中的字符数据,大小可达到2GB。LONG的所有功能(甚至更多)都由CLOB提供,不能在现代数据库中使用LONG,如果数据库有这种类型的列,应该将它们转换为CLOB。在表中只能有一个LONG列。

    LONG RAW 和LONG一样,但Oracle Net不会转换二进制数据。所有LONG RAW列都应该转换为BLOB。

006 下面是RAW和ROWID数据类型:

    RAW 可变长度的二进制数据,从1B到4KB。和char和varchar2数据类型不同,在select时,Oracle Net不会将RAW数据从数据库的字符集转换为用户进程的字符集,或者在insert时进行反向转换。

    ROWID 以64为基数编码的值,它是一个指向表中行的位置的指针。它里面是物理地址。ROWID是Oracle专有的数据类型,除非特别选择,否则不可见。

007 补充

    varchar2数据类型必须用一个数来限定,这个数表示列的最大长度。如果插入列的值小于这个值,那么没有问题:这个值只占用必要的空间。如果这个值比最大值还要长,那么insert会出现错误。如果将值更新为更长或更短的值,那么列的长度(和行本身)也会相应改变。如果没有输入,或者更新为Null,那么它根本不会占用空间。

    可以使用精度和小数位来限定number数据类型。精度设置数中的最大位数,小数位数表示小数点右边有多少位。如果小数位数是负数,那么会用0取代插入的数的最后几位,它不占用精度指定的位数。如果位数超过精度,那么会出现错误;如果它在精度之内但在小数位之外,那么数字会舍入为最小数位内最接近的值。

    date数据类型总是包括世纪、年、月、日、时、分、秒——即使在插入时没有指定所有这些元素。必须指定年、月、日。如果省略时、分、秒,那么它们默认为午夜。