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. 最佳实践
- VARCHAR2:通用
- NUMBER(p,s):精确
- TIMESTAMP:现代
- CLOB/BLOB:大对象
- SECUREFILE:LOB
- 避免 LONG:现代
- CHAR 谨慎:固定
- 23c+ 新类型:现代
- 类型匹配:避免隐式
- 文档化:设计
16. 参考资料
[1] Oracle Database SQL Language Reference 19c, “Data Types” https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/Data-Types.html