Oracle 常用数据类型:数值类型、字符类型、日期时间、大对象、特殊类型(ROWID、XML、JSON)附:和 MySql对比,Oracle 特有的关键字或方法
·
Oracle提供了丰富的数据类型,主要包括:
- 数值类型:NUMBER为主,支持任意精度数值,FLOAT用于科学计算
- 字符类型:VARCHAR2最常用,CHAR用于定长,CLOB处理大文本
- 日期时间:DATE(最常用)、TIMESTAMP(高精度)、带时区类型
- 大对象:BLOB(二进制)、CLOB(文本)、BFILE(外部文件)
- 特殊类型:ROWID、XML、JSON等
使用建议:
- 常规文本用VARCHAR2
- 数值用NUMBER
- 日期用DATE
- 大文本用CLOB
- 二进制数据用BLOB
Oracle的NUMBER类型是其特色,统一处理整数和小数,与其他数据库的DECIMAL/NUMERIC类似但实现方式不同。
Oracle 中的常用数据类型
以下是 Oracle 常用数据类型 的完整总结表格,按使用频率和场景分类:
一、数值类型
| 数据类型 | 语法示例 | 取值范围 / 说明 | 使用场景 |
|---|---|---|---|
NUMBER |
NUMBER |
最大38位精度,可存任意整数/小数 | 默认数值类型,通用 |
NUMBER(p) |
NUMBER(5) |
整数,范围 -99999~99999 | 年龄、数量、编号 |
NUMBER(p,s) |
NUMBER(7,2) |
整数位 7-2=5 位,小数位 2 位 | 金额、单价、汇率 |
FLOAT |
FLOAT |
浮点数,精度有限(二进制存储) | 科学计算(不推荐金融) |
💡 开发建议:除非特殊需求,否则直接用
NUMBER即可。
二、字符类型(最常用)
| 数据类型 | 语法 | 最大长度 | 特点 | 使用场景 |
|---|---|---|---|---|
VARCHAR2(n) |
VARCHAR2(100) |
4000 字节 | 变长存储,节省空间 | 默认字符串类型,90%场景用它 |
CHAR(n) |
CHAR(10) |
2000 字节 | 定长存储,会补空格 | 固定长度代码(如 '男'/'女') |
CLOB |
CLOB |
4GB | 大文本对象 | 文章、日志、JSON 字符串 |
LONG |
LONG |
2GB | 旧类型,功能受限 | 不推荐,用 CLOB 代替 |
⚠️ 注意:
VARCHAR2是 Oracle 特有,标准 SQL 中叫VARCHAR,但功能类似。
三、日期时间类型
| 数据类型 | 存储精度 | 格式示例 | 常用函数 | 使用场景 |
|---|---|---|---|---|
DATE |
精确到秒 | '2026-04-25 14:30:00' |
SYSDATE、TO_DATE |
默认日期类型,90%场景 |
TIMESTAMP |
精确到小数秒(最多9位) | '2026-04-25 14:30:00.123456' |
SYSTIMESTAMP |
需要毫秒级精度 |
TIMESTAMP WITH TIME ZONE |
带时区 | '2026-04-25 14:30:00 +08:00' |
FROM_TZ |
跨时区系统 |
INTERVAL YEAR TO MONTH |
年月间隔 | INTERVAL '2-3' YEAR TO MONTH |
NUMTOYMINTERVAL |
年龄计算、账期 |
INTERVAL DAY TO SECOND |
天时分秒间隔 | INTERVAL '5 02:30:00' DAY TO SECOND |
NUMTODSINTERVAL |
任务耗时、超时计算 |
四、大对象及二进制类型
| 数据类型 | 最大长度 | 特点 | 使用场景 |
|---|---|---|---|
BLOB |
4GB | 二进制大对象 | 图片、PDF、视频、文件 |
CLOB |
4GB | 字符大对象 | 长文本、XML、JSON |
BFILE |
无限制 | 文件指针,存储在 OS 文件系统 | 超大文件引用(不常用) |
RAW(n) |
2000 字节 | 定长二进制 | 加密数据、哈希值 |
LONG RAW |
2GB | 旧类型 | 不推荐,用 BLOB 代替 |
五、其他特殊类型
| 数据类型 | 说明 | 使用场景 |
|---|---|---|
ROWID |
伪列,物理行地址(18位字符串) | 快速定位行、去重 |
UROWID |
逻辑行地址,支持不同表 | 索引组织表 |
XMLTYPE |
XML 数据类型 | 存储和查询 XML 文档 |
JSON |
JSON 数据类型(12c+) | 存储和查询 JSON 文档 |
BOOLEAN |
布尔类型(23c 才支持) | 早期版本不支持,用 CHAR(1) 替代 |
六、快速选型指南(新手必看)
| 业务需求 | 推荐类型 | 示例 |
|---|---|---|
| 姓名、地址、描述 | VARCHAR2(长度) |
VARCHAR2(50) |
| 固定代码(性别、状态) | CHAR(长度) |
CHAR(1) |
| 年龄、数量、排名 | NUMBER(5) |
NUMBER(3) |
| 金额、单价 | NUMBER(10,2) |
NUMBER(8,2) |
| 创建时间、生日 | DATE |
DATE |
| 文章内容、日志 | CLOB |
CLOB |
| 图片、附件 | BLOB |
BLOB |
七、注意事项
-
VARCHAR2最大 4000 字节(12c 后可扩展到 32767 字节,需开启扩展) -
CHAR会浪费空间,定长补充空格,查询时需TRIM() -
LONG已废弃,新表不要用,用CLOB代替 -
NUMBER不带参数最灵活,但会占用更多存储空间 -
DATE包含时间,不要误以为只有日期
NUMBER 数据类型也是Oracle独有的吗?
不是完全独有的,但 Oracle 的 NUMBER 类型确实非常有特色,与其他数据库有明显差异。以下是详细对比:
一、Oracle 的 NUMBER 类型特点
sql
-- Oracle 语法 NUMBER -- 任意精度小数(最大38位) NUMBER(4) -- 整数,范围 -9999~9999 NUMBER(7,3) -- 小数,整数4位,小数3位
核心特性:
-
可存储任意精度的数值(整数/小数/科学计数法)
-
最大精度 38位
-
是 Oracle 的默认数值类型
二、与其他数据库对比
| 数据库 | 对应类型 | 主要差异 |
|---|---|---|
| Oracle | NUMBER(p,s) |
统一类型,支持整数/小数,最大38位精度 |
| MySQL | INT / DECIMAL(p,s) / NUMERIC |
需区分整数(INT/BIGINT)和小数(DECIMAL),DECIMAL最大65位精度 |
| PostgreSQL | NUMERIC(p,s) / DECIMAL |
类似Oracle,但用NUMERIC表示精确小数 |
| SQL Server | DECIMAL(p,s) / NUMERIC |
区分INT系列和DECIMAL,不支持统一的NUMBER |
| SQLite | INTEGER / REAL / NUMERIC |
动态类型,建议用INTEGER或REAL |
三、具体差异示例
1. MySQL 需要区分类型
sql
-- Oracle:统一使用 NUMBER
CREATE TABLE t (
id NUMBER(4), -- 整数
price NUMBER(7,3) -- 小数
);
-- MySQL:需明确指定
CREATE TABLE t (
id INT, -- 整数用INT
price DECIMAL(7,3) -- 小数用DECIMAL
);
2. 精度差异
sql
-- Oracle:最大38位 NUMBER(38,10) -- 整数28位,小数10位 -- MySQL:最大65位 DECIMAL(65,10) -- 整数55位,小数10位
3. 无精度声明时的差异
sql
-- Oracle:NUMBER 不指定精度 = 最大38位小数(灵活) price NUMBER -- 可存任意小数位数 -- MySQL:DECIMAL 不指定精度 = DECIMAL(10,0) price DECIMAL -- 实际是整数(10位)
四、总结
| 维度 | 结论 |
|---|---|
| 是否Oracle独有? | ❌ 不是独有,其他数据库有对应类型 |
| 特色在哪? | ✅ 统一用NUMBER表示数值,不需要区分整数/小数 |
| 最接近的对应 | MySQL/PostgreSQL 的 DECIMAL / NUMERIC |
| 开发建议 | 跨数据库时使用 DECIMAL 或 NUMERIC 更通用 |
一句话记忆:NUMBER 是 Oracle 的风格特色(统一类型),但不是语法专利,其他数据库用 DECIMAL / NUMERIC 实现相同功能。
和MySql对比,Oracle特有的关键字或方法
以下为您整理的 Oracle 特有(或与 MySQL 差异较大)的关键字与方法对比表,便于快速区分。
| 分类 | Oracle 特有 | 说明 / 用法 | MySQL 对应 / 备注 |
|---|---|---|---|
| 伪列 | ROWNUM |
限制返回行数,如 WHERE ROWNUM <= 5(在排序前生效) |
LIMIT(排序后生效) |
ROWID |
物理行地址,可最快定位一行,但可能变化 | 无直接对应 | |
| 字符串 | || |
字符串连接符,如 'A'||'B' → 'AB' |
CONCAT() 或 +(需设置模式) |
NVL(expr, 替换值) |
空值替换(通用) | IFNULL() 或 COALESCE() |
|
NVL2(expr, 非空值, 空值) |
非空/空值分别返回不同结果 | IF(expr IS NULL, 空值, 非空值) |
|
| 日期 | SYSDATE |
当前日期时间(精确到秒) | NOW() 或 CURRENT_TIMESTAMP |
TO_DATE('字符串', 格式) |
字符串转日期,如 TO_DATE('20260104','YYYYMMDD') |
STR_TO_DATE() |
|
MONTHS_BETWEEN |
计算两个日期间隔月份数 | TIMESTAMPDIFF(MONTH, ...) |
|
ADD_MONTHS |
日期加减月份 | DATE_ADD(..., INTERVAL n MONTH) |
|
| 事务 | COMMIT / ROLLBACK |
需手动提交/回滚(默认不自动提交) | InnoDB 也支持,但默认自动提交每句 SQL |
| 表操作 | TRUNCATE |
清空表,不能回滚,重置高水位线 | 同样有,但部分引擎行为不同 |
MODIFY 列名 类型 |
修改列数据类型 | MODIFY COLUMN 或 CHANGE COLUMN |
|
RENAME COLUMN 旧 TO 新 |
重命名列 | CHANGE COLUMN 旧 新 类型 |
|
| 分页 | 嵌套子查询 + ROWNUM |
需先排序再套子查询 | 直接用 LIMIT m, n 或 LIMIT n OFFSET m |
| 多表删除 | 子查询方式 | 不支持 DELETE t1,t2 FROM ... 语法 |
可直接 DELETE t1,t2 FROM ... JOIN ... |
| 递归查询 | CONNECT BY |
树形结构查询(如组织架构) | WITH RECURSIVE ... |
| 排名函数 | RANK() / DENSE_RANK() / ROW_NUMBER() |
窗口函数(8i 起逐步支持) | MySQL 8.0+ 同样支持 |
💡 注意:随着 Oracle 和 MySQL 版本迭代,部分差异在缩小(如 MySQL 8.0+ 已支持
RANK()、递归查询等)。上表以 开发中最常见、仍需注意的差异 为主。
更多推荐

所有评论(0)