一、Oracle 核心數據類型完整對照
| 類型 | 分類 | 最大長度/範圍 | 關鍵特性 |
| CHAR | 固定長度字元 | 2000 位元組 | 空白填充語義,比較時填充至同長度 |
| NCHAR | 多位元組固定長度 | 2000 字元/位元組 | 按字符集定長,國家字符集專用 |
| VARCHAR2 | 變長字元 | 4000 字元 | **首選字串類型**,非填充比較語義 |
| NVARCHAR2 | 多位元組變長 | 4000 字元/位元組 | 國家字符集變長類型 |
| DATE | 日期時間 | 7 位元組固定 | 含世紀/年/月/日/時/分/秒,預設格式 DD-MON-YY |
| NUMBER | 數值 | 38 位精度,10-130 ~ 10126 | 變長儲存,通常 4-21 位元組 |
| LONG | 長文本 | 2 GB | 已棄用,單表僅 1 列,限制極多 |
| RAW | 二進制 | 2000 位元組 | 不經字符集轉換 |
| LONG RAW | 長二進制 | 2 GB | 已棄用,同 LONG 限制 |
| BLOB | 二進制大物件 | 4 GB (受限於資料塊大小) | LOB 族首選,支援隨機讀寫 |
| CLOB | 字元大物件 | 4 GB | 字元集轉換支援 |
| NCLOB | 國家字符集 CLOB | 4 GB | NCHAR 字符集存儲 |
| BFILE | 外部二進制檔案 | OS 限制 | 唯讀,資料庫存儲目錄對象指標 |
| ROWID | 物理地址 | 10 位元組 (8i+) | 編碼:對象+檔案+塊+行 |
| UROWID | 通用 ROWID | 4000 位元組 | 支援索引組織表、外部表 |
| MLSLABEL | Trusted Oracle 標籤 | 2-5 位元組 | 極少用,標籤安全專用 |
遷移建議
- LONG/LONG RAW → **CLOB/BLOB** (10g+ 支援
TO_LOB 轉換)
- CHAR → **VARCHAR2** (除非固定長度代碼表)
- NUMBER(p,s) 明確指定精度刻度,避免隱含轉換
二、保留關鍵字 (8i 基準) — 不可作為對象名
ACCESS ADD ALL ALTER AND ANY AS ASC AUDIT BETWEEN
BY CHAR CHECK CLUSTER COLUMN COMMENT COMPRESS
CONNECT CREATE CURRENT DATE DECIMAL DEFAULT DELETE
DESC DISTINCT DROP ELSE EXCLUSIVE EXISTS FILE FLOAT
FOR FROM GRANT GROUP HAVING IDENTIFIED IMMEDIATE
IN INCREMENT INDEX INITIAL INSERT INTEGER INTERSECT
INTO IS LEVEL LIKE LOCK LONG MAXEXTENTS MINUS MLSLABEL
MODE MODIFY NOAUDIT NOCOMPRESS NOT NOWAIT NULL
NUMBER OF OFFLINE ON ONLINE OPTION OR ORDER PCTFREE
PRIOR PRIVILEGES PUBLIC RAW RENAME RESOURCE REVOKE
ROW ROWID ROWNUM ROWS SELECT SESSION SET SHARE
SIZE SMALLINT START SUCCESSFUL SYNONYM SYSDATE TABLE
THEN TO TRIGGER UID UNION UNIQUE UPDATE USER VALIDATE
VALUES VARCHAR VARCHAR2 VIEW WHENEVER WHERE WITH
完整動態查詢:SELECT * FROM V$RESERVED_WORDS
三、核心資訊快速查詢指令
| 需求 | SQL/命令 | 輸出關鍵信息 |
| 資料庫版本詳情 | SELECT * FROM V$VERSION | 版本號、核心版本、位數 (32/64-bit) |
| OS 層面確認位數 | file $ORACLE_HOME/bin/oracle | ELF 32-bit/64-bit LSB executable |
| 參數當前值 | SHOW PARAMETER param_name | 如 SPFILE 啟用狀態 |
| 所有參數 (含隱含) | SELECT * FROM V$PARAMETER | ISDEFAULT, ISSES_MODIFIABLE, ISSYS_MODIFIABLE |
| 隱含參數專用查詢 | 複雜 X$ 關聯查詢 (見原文) | 欄位:NAME, VALUE, DEFAULT, SES_MOD, SYS_MOD, MODIFIED, DESCRIPTION |
四、字符集三層架構與修改鐵律
三層字符集來源與優先級
| 層級 | 查詢視圖 | 來源 | 生效範圍 |
| 資料庫服務端 | NLS_DATABASE_PARAMETERS | PROPS$ 表 | 資料儲存實際編碼 |
| 客戶端環境 | NLS_INSTANCE_PARAMETERS | V$PARAMETER (參數檔/環境變數/註冊表) | 客戶端會話預設 |
| 會話級 | NLS_SESSION_PARAMETERS | V$NLS_PARAMETERS (ALTER SESSION / 環境變數) | 當前會話實際生效 |
優先級遞增:ALTER SESSION > 環境變數 > 註冊表 > 參數檔
字符集修改鐵律 (8i+)
- **僅支援子集 → 超集** 遷移 (如 US7ASCII → ZHS16GBK),**不可逆向**
- **嚴禁直接修改 PROPS$** 表,會導致資料字典不一致、嚴重損壞
- 標準流程:
STARTUP NOMOUNT;
ALTER DATABASE MOUNT EXCLUSIVE;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER DATABASE OPEN;
ALTER DATABASE CHARACTER SET ZHS16GBK; -- 目標字符集
SHUTDOWN IMMEDIATE;
STARTUP;
NLS_LANG 設定黃金法則
# 格式:語言_地區.字符集
# 字符集**必須**與資料庫字符集一致
# 語言建議用英文避免訊息亂碼
NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
五、函數索引建立前提 (8i+)
-- 必須參數
QUERY_REWRITE_ENABLED = TRUE
QUERY_REWRITE_INTEGRITY = TRUSTED
COMPATIBLE = 8.1.0 以上
-- 建立語法
CREATE INDEX idx_upper_name ON employees (UPPER(last_name));
-- 使用條件:WHERE 條件必須與索引表達式完全一致
SELECT * FROM employees WHERE UPPER(last_name) = 'KING';
六、表/分區移動語法與 LOB 特殊處理
表移動
ALTER TABLE table_name MOVE
[TABLESPACE new_ts]
[STORAGE (INITIAL 50M NEXT 50M PCTINCREASE 0 PCTFREE 10 PCTUSED 50 INITRANS 2)]
[NOLOGGING];
分區移動
ALTER TABLE table_name MOVE PARTITION part_name
[TABLESPACE new_ts]
[UPDATE GLOBAL INDEXES]; -- 9i+ 同步維護全域索引,否則需手動 REBUILD
LOB 段移動 (普通 MOVE 不移動 LOB)
ALTER TABLE table_name MOVE
LOB (lob_column) STORE AS (TABLESPACE new_ts);
七、SCN 獲取方式演進
| 版本 | 方法 | SQL |
| 9i 及之前 | X$ 表計算 | SELECT MAX(KTUXESCND*POWER(2,32)+KTUXESCNW) FROM X$KTUXE |
| 10g / 9i+ (含閃回) | DBMS_FLASHBACK | SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL |
| 12c+ | V$ 視圖直取 | SELECT CURRENT_SCN FROM V$DATABASE |
八、ROWID 結構解碼
| 版本 | 格式 | 組成 (十六進制) | 欄位含義 |
| 8i+ (擴展) | OOOOOO FFF BBBBBB RRR | 6+3+6+3 = 18 字元 | 對象ID、檔案ID、塊ID、行ID |
| 8.0 之前 (受限) | BBBBBBBB.RRRR.FFFF | 8+4+4 = 16 字元 | 塊ID.行ID.檔案ID |
應用:統計表實際佔用塊數
SELECT COUNT(DISTINCT DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)) AS used_blocks
FROM large_table;
九、DBMS_METADATA 獲取 DDL (9i+)
單對象 DDL
SET LONG 90000 PAGES 0 HEADING OFF FEEDBACK OFF ECHO OFF
SELECT DBMS_METADATA.GET_DDL('TABLE', 'TABLE_NAME', 'SCHEMA_NAME') FROM DUAL;
全模式腳本化
SELECT DBMS_METADATA.GET_DDL('TABLE', TABLE_NAME)
FROM USER_TABLES;
索引/約束/視圖/序列等同理,修改物件類型參數即可。
十、約束索引指定表空間技巧
方法一:先建索引再建約束
CREATE INDEX pk_idx ON t(c1) TABLESPACE index_ts;
ALTER TABLE t ADD CONSTRAINT pk_c1 PRIMARY KEY (c1) USING INDEX pk_idx;
方法二:單條 SQL 內建 (8i+)
CREATE TABLE test (
c1 NUMBER CONSTRAINT pk_c1 PRIMARY KEY USING INDEX TABLESPACE user_idx,
c2 VARCHAR2(10)
) TABLESPACE user_data;
結語
本文匯總 Oracle 架構體系最高頻 10 大 FAQ 類別,從數據類型選型到字符集遷移鐵律,從隱含參數探勘到 DDL 元數據提取,構成 DBA 與開發者的「隨身速查手冊」。建議將核心查詢 SQL 封裝為 dba_quick_check.sql 腳本庫,新環境接手時首批執行,快速建立系統畫像。