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));