Oracle数据类型

  • 格式:docx
  • 大小:41.49 KB
  • 文档页数:11

oracle 数据类型

以下的大多数类型的描述都经本人验证,但不免有错误,请不吝赐教

(oracle: 10.2.0.3.0 , plsql: 7.1.5.1398 )

注:以下两个函数有助于理解数据类型

length() 当前列存储值的字符长度;

vsize() 当前列存储值所占用字节数。

1. CHAR

固定长度字符域, 最大长度可达 2000 个字符或者字节。默认指定为以字符形式进行存储,并 且当位数不够时 oracle 在其右边添加空格来补满。

例如:

2. VARCHAR2

可变长度字符域,最大长度可达 4000 个字符。

例如:

CREATE TABLE test(name varchar2(20))

2.1. CHAR 和 VARCHAR2 区别

1.CHAR 的长度是固定的, 而 VARCHAR2 的长度是可以变化的, 比如,存储字符串 ,

对于CHAR (20),表示你存储的字符将占20 个字节(包括 17 个空字符),而同样的VARCHAR2

(20)则只占用 3 个字节的长度, 20 只是最大值,当你存储的字符小于 20 时,按实际长度存

储。

2 .CHAR 的效率比 VARCHAR2 的效率稍高。

3.目前 VARCHAR 是 VARCHAR2 的同义词。工业标准的 VARCHAR 类型可以存储空字

符串,但是 Oracle 不这样做,尽管它保留以后这样做的权利。Oracle 自己开辟了一个数据

类型 VARCHAR2,这个类型不是一个标准的 VARCHAR,它将在数据库中 varchar 列可以

存储空字符串的特性改为存储 NULL 值。 假如你想有向后兼容的能力,Oracle 建议使用

VARCHAR2 而不是 VARCHAR。

何时该用 CHAR,何时该用 varchar2?

CHAR 与 VARCHAR2 是一对矛盾的统一体,两者是互补的关系. VARCHAR2 比 CHAR

节省空间,在效率上比 CHAR 会稍微差一些,即要想获得效率, 就必须牺牲一定的空间,

这也就是我们在数据库设计上常说的‘以空间换效率’ 。 VARCHAR2 虽然比 CHAR 节 省空间, 但是假如一个 VARCHAR2 列时常被修改, 而且每次被修改的数据的长度不同, 这

会引起‘行迁移’(Row Migration)现象,而这造成多余的 I/O,是数据库设计和调整中要竭力

避免的,在这种情况下用 CHAR 代替 VARCHAR2 会更好一些。

3. NCHAR

多字节字符集的固定长度字符域,长度随字符集而定,最多为 1000 个字符(即 2000 个字节)。

不管是中文还是英文每一个字符都占 2 个字节。

NCHAR 的列在位数不够时需要在右边填充空格。

例如:

CREATE TABLE test(name Nchar(20))

4. NVARCHAR2

多字节字符集的可变长度字符域,长度随字符集而定,最多为 2000 个字符(即 4000 个字节)。

5. LONG

LONG 类型的列存储可变长度的字符串,最多可以存储 2GB 的数据。 LONG 数据类型的

使用是为了向前兼容的需要。建议使用 CLOB 数据类型来代替 LONG 类型。

例如:

CREATE TABLE test(name long)

注: long 类型主要用于不需要作字符串搜索的长串数据,如果要进行字符搜索就要用

varchar2 类型。不少工具,包括 sql*plus,处理 long 数据类型都是很艰难的。 long 数据类

型的使用中, 要受限于磁盘的大小。一个表中只能包含一个 long 类型的列, 此外还有不少

限制,如不能做索引、不能用于分布查询、 不能做聚簇等等。不能用于分布查询

6. NUMBER

可变长度数值列, 允许值为 0、正数和负数。 NUMBER 值通常以 4 个字节或者更少的字节存 储,最多 21 字节。

Number 的数据声明如下:

Number(p, s) : 声明一个定点数, p(precision)为精度, 它表示存储在列中数字的总长度;

s(scale)表示小数点右边的数字个数, p 范围 1-38,sc 范围-84 到 127,s 为负数时, Oracle

就对小数点左边的 s 个数字进行舍入。 Number(p):声明一个整数,相当于 Number(p, 0)

Number:声明一个浮点数,其精度为 38,要注意的是 s 的值没有应用,也就是说 s 的指不

能简单的理解为 0 ,或者其他的数。

7. DATE

用于存储全部日期的固定长度(7 个字节)字符域,时间作为日期的一部份存储其中。除非

通过设置 init.ora 文件的 NLS_DATE_FORMAT 参数来取代日期格式, 否则查询时, 日期以

DD-MON-YY 格式表示,如 13-APR-99 表示 1999.4.13

存储时间的精度可以达到 1/100s 。不提供时区的相关信息。

例如:

CREATE TABLE test(name DATE)

8. TIMESTAMP

使用年、月、日、小时、分钟、秒域来对日期/时间提供更详细的支持。最多可以使用 9 位

数字的精度来存储秒(受底层操作系统支持的限制)。这个数据类型没有时区的相关信息,

它主要用于高精度时间存储,它可以在 Oracle9i 数据库及其更新的版本中使用。

例如:

CREATE TABLE test(timestamp_column TIMESTAMP);

Date 转换成 timestamp:

select sysdate , cast ( sysdate as timestamp), systimestamp from dual

另:to_ char 支持 date 和 timestamp ,trunc 不支持 timestamp 。

获取系统时间的 timestamp 类型用 systimestamp。

9. TIMESTAMP WITH TIME ZONE

包含 TIMESTAMP 数据类型中的所有域, 除此之外,还包含两个额外的域: timezone_hour

和 timezone_minute。这个数据类型包含支持时区的相关信息,在数据库中占 13 字节。

这个数据类型可以在 Oracle9i 数据库及其更新的版本中使用。

例如:

CREATE TABLE test(timestamp_column timestamp with time zone);

10. TIMESTAMP with local time zone

除了在数据库中存储的时区采用标准化以外, 所包含的其他域与 TIMESTAMP 数据类型中

的域相同。 当选择列时, 将日期/时间标准为会话的时区。 该数据类型在 TIMESTAMP WITH

TIME ZONE 的基础上又有进一步. 在用户提交时间给数据库时, 该类型会转换成数据的时

区来保存数据, 即在数据库中保存的时间是数据库本地的时区. 当别的地方用户访问数据

库时在显示该类型数据时 Oracle 会将该时区转换成客户端的时间来显示. 在数据库中保存

占 7 到 11 字节, 具体看你定义的 fractional seconds 的精度.

该数据类型可以在 Oracle9i 数据库及其更新的版本中使用。

例如

CREATE TABLE test(timestamp_column timestamp with local time zone);

11. INTERVAL YEAR TO MONTH

用于存储一个时间段,由月份和年组成。需要 5 字节来存储。

这个数据类型可以在 Oracle9i 数据库及其更新的版本中使用。

例如:

SELECT INTERVAL '01-05' YEAR TO MONTH - INTERVAL '01-02' YEAR TO MONTH

FROM dual;

12. INTERVAL DAY TO SECOND

用于存储一个时间段,由日和秒组成。需要 11 字节存储。

该数据类型可以在 Oracle9i 数据库及其更新的版本中使用。

例如:

SELECT INTERVAL '100 10:20:42 . 22' DAY (3) TO SECOND (2) - INTERVAL '101

10:20:42 . 22' DAY (3) TO SECOND (2) FROM dual;

13. RAW

RAW 表示二进制数据的可变长度字符域, 最长为 2000 个字节。建议使用 BLOB 来代替它。

例如:

CREATE TABLE test (raw_column RAW(2000));