Oracle提供了丰富的数据类型,主要包括:

  1. 数值类型:NUMBER为主,支持任意精度数值,FLOAT用于科学计算
  2. 字符类型:VARCHAR2最常用,CHAR用于定长,CLOB处理大文本
  3. 日期时间:DATE(最常用)、TIMESTAMP(高精度)、带时区类型
  4. 大对象:BLOB(二进制)、CLOB(文本)、BFILE(外部文件)
  5. 特殊类型: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' SYSDATETO_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

七、注意事项

  1. VARCHAR2 最大 4000 字节(12c 后可扩展到 32767 字节,需开启扩展)

  2. CHAR 会浪费空间,定长补充空格,查询时需 TRIM()

  3. LONG 已废弃,新表不要用,用 CLOB 代替

  4. NUMBER 不带参数最灵活,但会占用更多存储空间

  5. 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 动态类型,建议用INTEGERREAL

三、具体差异示例

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()、递归查询等)。上表以 开发中最常见、仍需注意的差异 为主。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐