Oracle 数据类型详解

Oracle 数据类型详解

适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

Oracle 数据类型决定数据存储与操作[1]:

详细见:Oracle 数据类型详解


2. 字符类型

2.1 VARCHAR2

CREATE TABLE t (
  name VARCHAR2(100),  -- 可变长度
  name2 VARCHAR2(100 CHAR),  -- 按字符
  name3 VARCHAR2(100 BYTE)   -- 按字节(默认)
);
说明
最大4000 字节(11g)/ 32767 字节(12c+ MAX_STRING_SIZE=EXTENDED)
存储实际长度
推荐通用字符串

2.2 CHAR

CREATE TABLE t (code CHAR(10));  -- 固定长度
  • 固定长度,空格填充
  • 短代码

2.3 NCHAR / NVARCHAR2

CREATE TABLE t (
  name NVARCHAR2(100),  -- 国家字符集
  code NCHAR(10)
);
  • 国家字符集(UTF16 / AL16UTF16)

2.4 CLOB

CREATE TABLE t (doc CLOB);  -- 大文本
  • 最大 4GB(或更大)
  • 大文档

2.5 NCLOB

CREATE TABLE t (doc NCLOB);
  • 国家字符集大文本

2.6 LONG(避免)

CREATE TABLE t (doc LONG);  -- 老式,避免
  • 兼容
  • 改用 CLOB

3. 数值类型

3.1 NUMBER

CREATE TABLE t (
  id NUMBER,           -- 通用
  salary NUMBER(10, 2),  -- 10 位精度,2 位小数
  rate NUMBER(*, 4)      -- 任意精度,4 位小数
);
  • 精度:1-38
  • 小数:-84 to 127

3.2 FLOAT

CREATE TABLE t (rate FLOAT(126));
  • 二进制精度
  • 1-126

3.3 BINARY_FLOAT

CREATE TABLE t (rate BINARY_FLOAT);  -- 单精度
  • 32 位
  • 性能

3.4 BINARY_DOUBLE

CREATE TABLE t (rate BINARY_DOUBLE);  -- 双精度
  • 64 位
  • 性能

3.5 BOOLEAN(23ai+)

CREATE TABLE t (
  is_active BOOLEAN DEFAULT TRUE,
  is_admin BOOLEAN DEFAULT FALSE
);

INSERT INTO t (is_active) VALUES (TRUE);
SELECT * FROM t WHERE is_active;

详细见:Oracle 23c 新特性 SQL


4. 日期类型

4.1 DATE

CREATE TABLE t (hire_date DATE);
  • 日期 + 时间(秒)
  • 公元前 4712 - 公元 9999

4.2 TIMESTAMP

CREATE TABLE t (
  ts TIMESTAMP,                       -- 纳秒
  ts2 TIMESTAMP(6),                   -- 6 位小数
  ts3 TIMESTAMP(9)                    -- 9 位小数
);

4.3 TIMESTAMP WITH TIME ZONE

CREATE TABLE t (ts TIMESTAMP WITH TIME ZONE);
-- 带时区

4.4 TIMESTAMP WITH LOCAL TIME ZONE

CREATE TABLE t (ts TIMESTAMP WITH LOCAL TIME ZONE);
-- 数据库时区,会话显示本地

4.5 INTERVAL

CREATE TABLE t (
  duration INTERVAL DAY(2) TO SECOND(3),
  age INTERVAL YEAR(3) TO MONTH
);

INSERT INTO t VALUES (INTERVAL '5 12:30:00' DAY TO SECOND, INTERVAL '30-6' YEAR TO MONTH);

5. RAW

5.1 RAW

CREATE TABLE t (data RAW(100));
  • 二进制
  • 最大 2000

5.2 BLOB

CREATE TABLE t (data BLOB);
  • 大二进制
  • 最大 4GB+

5.3 LONG RAW(避免)

CREATE TABLE t (data LONG RAW);  -- 避免
  • 改用 BLOB

6. LOB

6.1 类型

CLOB - 字符大对象
NCLOB - 国家字符集
BLOB - 二进制
BFILE - 外部文件

6.2 存储

CREATE TABLE t (
  id NUMBER,
  doc CLOB
) LOB (doc) STORE AS SECUREFILE (
  ENABLE STORAGE IN ROW
  COMPRESS HIGH
  DEDUPLICATE
  CACHE
);

6.3 操作

DECLARE
  v_clob CLOB;
BEGIN
  DBMS_LOB.CREATETEMPORARY(v_clob, TRUE);
  DBMS_LOB.WRITEAPPEND(v_clob, 5, 'Hello');
  DBMS_LOB.APPEND(v_clob, ' World');
  
  DBMS_OUTPUT.PUT_LINE(DBMS_LOB.GETLENGTH(v_clob));
  DBMS_OUTPUT.PUT_LINE(DBMS_LOB.SUBSTR(v_clob, 5, 1));
  
  DBMS_LOB.FREETEMPORARY(v_clob);
END;
/

7. ROWID / UROWID

7.1 ROWID

SELECT ROWID, id FROM employees;
-- AAAWuHAAEAAAAAbAAA
  • 物理地址
  • 唯一

7.2 UROWID

-- 通用 ROWID
-- 索引组织表 / 异构

8. JSON / XML

8.1 JSON(21c+)

CREATE TABLE t (doc JSON);

详细见:Oracle JSON 处理详解

8.2 XMLType

CREATE TABLE t (doc XMLType);

详细见:Oracle XML 处理详解


9. VECTOR(23ai)

CREATE TABLE t (
  embedding VECTOR(768, FLOAT32)
);
  • AI Vector Search
  • 相似查询

详细见:Oracle 23c 新特性 SQL


10. 用户定义类型

10.1 对象

CREATE TYPE address_type AS OBJECT (
  street VARCHAR2(100),
  city VARCHAR2(50),
  zip VARCHAR2(10)
);

CREATE TABLE employees (
  id NUMBER,
  address address_type
);

INSERT INTO employees VALUES (1, address_type('Main St', 'NY', '10000'));

10.2 集合

CREATE TYPE phone_list AS VARRAY(5) OF VARCHAR2(20);

CREATE TABLE contacts (
  id NUMBER,
  phones phone_list
);

详细见:Oracle PL/SQL 集合详解


11. 隐式转换

11.1 安全

- VARCHAR2 → NUMBER
- DATE → VARCHAR2
- NUMBER → VARCHAR2

11.2 危险

- 阻止索引
- 性能下降
- 错误可能

11.3 显式

TO_NUMBER('100')
TO_DATE('2026-07-21', 'YYYY-MM-DD')
TO_CHAR(100)
TO_TIMESTAMP(...)

12. 选择

12.1 字符串

- 通用:VARCHAR2
- 短代码:CHAR
- 大文本:CLOB
- 多语言:NVARCHAR2 / NCLOB

12.2 数值

- 通用:NUMBER
- 浮点:BINARY_FLOAT / BINARY_DOUBLE
- 布尔(23ai+):BOOLEAN

12.3 日期

- 日期:DATE
- 时间戳:TIMESTAMP
- 时区:TIMESTAMP WITH TIME ZONE

12.4 二进制

- 短:RAW
- 大:BLOB
- 文件:BFILE

13. 性能

13.1 类型影响

- 存储
- 计算
- I/O
- 内存

13.2 推荐

- 合适类型
- 避免 LONG / LONG RAW
- SECUREFILE LOB
- 现代类型

14. 常见坑与排错

14.1 ORA-01722

- 无效数字
- 字符串转换

14.2 ORA-01858

- 日期格式
- TO_DATE

14.3 ORA-12899

- 列长度
- VARCHAR2 / CHAR

14.4 LONG 限制

- 改用 CLOB
- 兼容性

15. 最佳实践

  1. VARCHAR2:通用
  2. NUMBER(p,s):精确
  3. TIMESTAMP:现代
  4. CLOB/BLOB:大对象
  5. SECUREFILE:LOB
  6. 避免 LONG:现代
  7. CHAR 谨慎:固定
  8. 23c+ 新类型:现代
  9. 类型匹配:避免隐式
  10. 文档化:设计

16. 参考资料

[1] Oracle Database SQL Language Reference 19c, “Data Types” https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/Data-Types.html