Oracle資料類型分為三大類:字元類型、數值類型、其他特殊類型。正確選型直接影響儲存效率、查詢效能與應用正確性。
| 類型 | 長度範圍 | 儲存特性 | 適用場景 | 建議 |
|---|---|---|---|---|
| CHAR | 1-2000位元組 | 固定長度,不足右補空格 | 固定長度代碼(如身分證字號、國別代碼) | 慎用,浪費空間 |
| VARCHAR2 | 1-4000位元組 | 可變長度,實際長度儲存 | 通用字串欄位(姓名、地址、描述) | 首選字元類型 |
| NCHAR | 1-2000字元 | 固定長度,使用NLS字符集 | 多語言固定長度欄位 | 特定國際化需求 |
| NVARCHAR2 | 1-4000字元 | 可變長度,使用NLS字符集 | 多語言可變長度欄位 | 國際化應用首選 |
| LONG | 2GB | 舊版大物件,限制多 | 歷史系統相容 | 棄用,改用CLOB |
| CLOB/NCLOB | 4GB | 大字元物件,支援隨機存取 | 長文本、日志、JSON/XML文檔 | 大文本首選 |
-- CHAR(10) 存 'ABC' → 實際佔用10位元組 'ABC '
-- VARCHAR2(10) 存 'ABC' → 實際佔用3位元組 'ABC'
-- 查詢時:WHERE char_col = 'ABC' 需注意空格匹配問題
Oracle官方強烈建議:優先使用VARCHAR2,節省空間並避免空格比較陷阱。
NUMBER[(precision[, scale])]
-- precision: 有效數字總位數 (1-38),預設38
-- scale: 小數點右邊位數 (-84 到 127),預設0
| 定義 | 含義 | 範例儲存值 | 實際儲存 |
|---|---|---|---|
| NUMBER(6,2) | 共6位,2位小數 | 1234.56 | 1234.56 |
| NUMBER(6,-2) | 小數點左移2位 | 123456 | 123500 (四捨五入) |
| NUMBER(*,3) | 精度最大,3位小數 | 1.2345 | 1.235 |
| 類型 | 精度 | 儲存大小 | 特色 |
|---|---|---|---|
| DATE | 秒 | 7位元組 | 含年月日時分秒,標準格式DD-MON-YY HH:MI:SS |
| TIMESTAMP | 奈秒 | 7-11位元組 | 高精度,支援時區無關 |
| TIMESTAMP WITH TIME ZONE | 奈秒 | 13位元組 | 含時區位移,跨時區應用必備 |
| TIMESTAMP WITH LOCAL TIME ZONE | 奈秒 | 7-11位元組 | 自動轉換至資料庫/會話時區 |
| INTERVAL YEAR TO MONTH | 月 | 5位元組 | 年月間隔 |
| INTERVAL DAY TO SECOND | 奈秒 | 11位元組 | 天秒間隔 |
日期格式控制: NLS_DATE_FORMAT參數、ALTER SESSION SET NLS_DATE_FORMAT、TO_DATE/TO_CHAR格式模型。
| 類型 | 最大長度 | 用途 |
|---|---|---|
| RAW | 2000位元組 | 位圖、加密金鑰、二進制簽名 |
| LONG RAW | 2GB | 舊版大二進制,棄用改用BLOB |
| BLOB | 4GB | 圖片、文件、多媒體、序列化物件 |
| BFILE | OS檔案大小 | 唯讀外部檔案指標,資料庫不儲存內容 |
ROWID:物理地址偽欄,最快單行存取路徑UROWID:通用ROWID,支援索引組織表、外部表| 類型 | 資料內容 | 事務支援 | 管理介面 |
|---|---|---|---|
| CLOB | 字元資料 | 完整支援 | DBMS_LOB / OCI / JDBC |
| NCLOB | NLS字元資料 | ||
| BLOB | 二進制資料 |
LOB可儲存於資料庫內(內部LOB)或指向外部檔案(BFILE)。Oracle 9i+提供LONG→LOB自動轉換功能。
Oracle依上下文自動轉換(如數字||字串→字串,字串比較數字→數字)。風險:隱式轉換導致索引失效、效能損耗、結果不可預期。
TO_CHAR(number|date, fmt) -- 轉字串
TO_NUMBER(char, fmt) -- 轉數字
TO_DATE(char, fmt) -- 轉日期
CAST(expr AS type) -- ANSI標準轉換
-- 連接運算子 ||
SELECT 'Hello' || ' ' || 'World' FROM dual; -- Hello World
-- 數字自動轉字串參與連接
SELECT 'Salary: ' || 50000 FROM dual; -- Salary: 50000
IS NULL / IS NOT NULLNVL(expr1, expr2)、COALESCE、NULLIF、NVL2處理空值| 業務需求 | 推薦類型 | 避免類型 |
|---|---|---|
| 固定長度代碼/標識 | CHAR / VARCHAR2 | NCHAR(除非多語言) |
| 通用變長文字 | VARCHAR2 | CHAR, LONG |
| 多語言文字 | NVARCHAR2 | VARCHAR2(單字符集環境) |
| 大文本/文檔 | CLOB | LONG, VARCHAR2(4000+) |
| 精確金額計算 | NUMBER(precision, scale) | FLOAT, BINARY_FLOAT |
| 高精度時間戳 | TIMESTAMP(6) | DATE(秒級精度不足時) |
| 跨時區應用 | TIMESTAMP WITH TIME ZONE | DATE, TIMESTAMP |
| 二進制檔案/圖片 | BLOB | LONG RAW, RAW(2000+) |
| 外部大檔案引用 | BFILE | BLOB(若不需資料庫管理) |
資料類型選型是資料庫設計的基石。核心原則:字元用VARCHAR2、數值用NUMBER(p,s)、大物件用LOB、日期用TIMESTAMP系列、國際化用N類型、特殊需求用XMLType/物件型別。嚴禁使用LONG/LONG RAW,嚴謹處理NULL語意,顯式控制類型轉換,建立統一的命名與選型規範。