本文系統整理 Oracle 核心邏輯結構的定義語法、選型原理、存儲細節與最佳實務,適合 DBA 設計表結構、開發人員編寫 DDL、架構師做容量規劃時查閱。
| 類型 | 長度語義 | 最大值 | 字元集 | 典型用途 |
|---|---|---|---|---|
| CHAR(n BYTE|CHAR) | 固定,空格填充 | 2000 位元組 | DB 字元集 | 固定代碼、MD5、UUID |
| VARCHAR2(n BYTE|CHAR) | 可變 | 4000 位元組 | DB 字元集 | 通用業務字串,**建議 CHAR 語義** |
| NCHAR(n) | 固定,字元計 | 2000 位元組 | 國家字元集 | 極少用 |
| NVARCHAR2(n) | 可變,字元計 | 4000 位元組 | 國家字元集 | 嚴格字元語義、跨平台移植 |
| CLOB / NCLOB | 大物件 | (4GB-1)×Block | DB/國家字元集 | 長文本、日誌、JSON 文檔 |
關鍵:NLS_LENGTH_SEMANTICS 預設 BYTE,**DDL 中顯式寫 CHAR**;VARCHAR 別用,**永遠用 VARCHAR2**;空字串 '' 在 VARCHAR2/NVARCHAR2 中等同 NULL。
| 類型 | 定義 | 範圍/精度 | 存儲 |
|---|---|---|---|
| NUMBER(p,s) | p=精度(1~38), s=刻度(-84~127) | 10^-130 ~ 10^126 | 1~22 位元組 |
| INTEGER | NUMBER(38,0) | 整數 | 同上 |
| BINARY_FLOAT | 32-bit IEEE 754 | ~6 位有效數字 | 5 位元組 |
| BINARY_DOUBLE | 64-bit IEEE 754 | ~15 位有效數字 | 9 位元組 |
| FLOAT(n) | 二進制精度 n 位 (1~126) | 約等同 NUMBER | 變長 |
| 類型 | 大小 | 精度/特性 |
|---|---|---|
| DATE | 7 位元組 | 秒級,公元前 4712 ~ 公元 9999 |
| TIMESTAMP(n) | 7/11 位元組 | 小數秒最多 9 位 |
| TIMESTAMP WITH TIME ZONE | 13 位元組 | 含時區位移 |
| TIMESTAMP WITH LOCAL TIME ZONE | 11 位元組 | 自動轉換會話時區 |
| INTERVAL YEAR TO MONTH | 5 位元組 | 年月間隔 |
| INTERVAL DAY TO SECOND | 11 位元組 | 天秒間隔 |
RAW(n) / LONG RAW:2000/2GB 二進制,不做字元集轉換。BLOB:二進制大對象 (圖片、聲音、視頻)。BFILE:外部檔案指標,唯讀,最大 4GB。ROWID:物理行地址 (堆表);UROWID:通用行地址 (IOT、外部表)。CREATE TABLE demo (
id NUMBER(10) PRIMARY KEY,
code VARCHAR2(20 CHAR) NOT NULL UNIQUE,
name VARCHAR2(100 CHAR) NOT NULL,
status CHAR(1 BYTE) DEFAULT 'A' CHECK (status IN ('A','I','D')),
dept_id NUMBER(10),
created_by VARCHAR2(30) DEFAULT USER,
created_dt DATE DEFAULT SYSDATE,
CONSTRAINT fk_demo_dept FOREIGN KEY (dept_id) REFERENCES dept(id) ON DELETE SET NULL,
CONSTRAINT ck_name_len CHECK (LENGTH(name) >= 2)
) TABLESPACE users
PCTFREE 10 PCTUSED 80
STORAGE (INITIAL 64K NEXT 1M MINEXTENTS 1 MAXEXTENTS UNLIMITED);
ALTER TABLE demo ENABLE VALIDATE CONSTRAINT fk_demo_dept; -- 驗證現有+未來
ALTER TABLE demo ENABLE NOVALIDATE CONSTRAINT fk_demo_dept; -- 僅未來
ALTER TABLE demo DISABLE CONSTRAINT fk_demo_dept; -- 停用
ALTER TABLE demo DROP CONSTRAINT fk_demo_dept CASCADE; -- 刪除含級聯 FK
| 索引類型 | 適用場景 | 建立範例 |
|---|---|---|
| B*Tree (預設) | 高選擇性、範圍掃描、主鍵/唯一 | CREATE INDEX idx_demo_code ON demo(code) TABLESPACE idx_ts; |
| 位圖索引 | 低基數 (性別、狀態)、OLAP、分區表 | CREATE BITMAP INDEX idx_demo_status ON demo(status); |
| 函數索引 | WHERE UPPER(name) = 'ABC' | CREATE INDEX idx_demo_upper_name ON demo(UPPER(name)); |
| 反向索引 | 右增長熱塊 (序列 PK) | CREATE INDEX idx_demo_rev_id ON demo(id) REVERSE; |
| 複合索引 | WHERE dept_id=1 AND status='A' | CREATE INDEX idx_demo_dept_status ON demo(dept_id, status); |
| 分區索引 LOCAL | 大表分區裁剪 | CREATE INDEX ... ON demo(dept_id) LOCAL; |
CREATE CLUSTER hr_cluster (dept_id NUMBER)
PCTUSED 80 PCTFREE 5 SIZE 500 TABLESPACE users
STORAGE (INITIAL 200K NEXT 300K MINEXTENTS 2 MAXEXTENTS UNLIMITED PCTINCREASE 33);
CREATE TABLE dept_info (dept_id NUMBER PRIMARY KEY, dept_name VARCHAR2(100))
CLUSTER hr_cluster(dept_id);
CREATE TABLE emp_info (emp_id NUMBER PRIMARY KEY, emp_name VARCHAR2(50), dept_id NUMBER)
CLUSTER hr_cluster(dept_id);
-- 必須建叢集索引
CREATE INDEX idx_hr_cluster ON CLUSTER hr_cluster TABLESPACE users;
ALTER CLUSTER hr_cluster PCTUSED 60 PCTFREE 30; -- 僅影響新塊
DROP CLUSTER hr_cluster INCLUDING TABLES CASCADE CONSTRAINTS; -- 連帶刪表、FK
CREATE CLUSTER hash_cluster (id NUMBER) SIZE 512 SINGLE TABLE HASHKEYS 500;
-- HASH IS id -- 可指定哈希函數列,預設內部哈希
CREATE TABLE area (area_id NUMBER PRIMARY KEY, area_name VARCHAR2(200))
CLUSTER hash_cluster(area_id);
限制:不可 ALTER SIZE/HASHKEYS/HASH IS;不需/不可建叢集索引;單表哈希叢集適合全表掃描少、等值查詢多、鍵值唯一的場景。
| 參數 | 含義 | 建議值 |
|---|---|---|
| PCTFREE | 塊預留更新空間 % | 10 (OLTP) / 20 (頻繁更新) |
| PCTUSED | 塊可再用閾值 % | 80 (OLTP) / 40 (批量載入) |
| INITRANS | 初始事務槽數 | 2 (OLTP) / 10 (高併發) |
| MAXTRANS | 最大事務槽數 (已廢棄,由塊大小決定) | 255 |
| INITIAL | 首個 Extent 大小 | 64K~1M 視表大小 |
| NEXT | 後續 Extent 大小 | 1M~10M |
| MINEXTENTS | 最小 Extent 數 | 1 |
| MAXEXTENTS | 最大 Extent 數 | UNLIMITED |
| PCTINCREASE | Extent 增長 % (LMT 下無效) | 0 (LMT 建議) |
LMT (Locally Managed Tablespace) + ASSM (Auto Segment Space Management) 已自動管理 PCTFREE/PCTUSED/EXTENTS,**建議拋棄手動存儲子句,改用預設**。
Oracle 邏輯結構設計的核心決策樹:
VARCHAR2(n CHAR) (AL32UTF8) / 固定代碼 → CHAR / 跨平台字元語義 → NVARCHAR2。NUMBER(p,s) 精確 / 科學計算 → BINARY_DOUBLE。TIMESTAMP(n) 需小數秒 / DATE 兼容舊碼。ENABLE VALIDATE。PCTFREE/INITRANS 微調。將上述模板納入團隊 DDL 規範,配合版本控管 (Flyway/Liquibase) 與 Code Review,即可實現結構變更的標準化、可追溯、可回滾。