前言
選擇正確資料型態關係資料完整性、儲存效率與效能。本文整理 Oracle 19c/21c 主流資料型態,含最大長度、儲存特性、適用場景與常見誤區。
字元型態
| 型態 | 最大長度 | 特性 | 適用場景 |
| CHAR(n) | 2,000 Bytes | 固定長度,不足右補空格,比較時 Blank-padded | 固定長代碼 (ISO 國別碼、狀態碼)、主鍵為定長字串 |
| NCHAR(n) | 2,000 Bytes / 字符 | Unicode 固定長度,字符語意 (NLS_NCHAR_CHARACTERSET) | 多語系固定長欄位 |
| VARCHAR2(n) | 4,000 Bytes (MAX_STRING_SIZE=EXTENDED 時 32,767) | 可變長度,**不補空格**,比較 Non-padded,**標準首選** | 一般文字、描述、JSON/XML 片段 |
| NVARCHAR2(n) | 4,000 Bytes / 字符 | Unicode 可變長度 | 多語系可變長文字 |
數值型態
| 型態 | 精度/範圍 | 儲存 | 備註 |
| NUMBER(p, s) | p=1~38 位精度, s=-84~127 小數位 | 可變長度 (1~22 Bytes),科學記號儲存 | **通用數值型態**,整數、金額、科學計算皆適用 |
| BINARY_FLOAT | 32-bit IEEE 754 | 4 Bytes | 單精度浮點,近似值運算 |
| BINARY_DOUBLE | 64-bit IEEE 754 | 8 Bytes | 雙精度浮點,近似值運算 |
日期時間型態
| 型態 | 精度/範圍 | 儲存 | 備註 |
| DATE | 秒 (BC 4712 ~ AD 9999) | 7 Bytes 固定 | 含年月日時分秒,**無時區、無毫秒** |
| TIMESTAMP(p) | 毫秒/微秒/奈秒 (p=0~9, 預設 6) | 7~11 Bytes | 高精度時間戳,無時區 |
| TIMESTAMP(p) WITH TIME ZONE | 同上 + 時區位移 | 13 Bytes | 跨時區應用必備 |
| TIMESTAMP(p) WITH LOCAL TIME ZONE | 同上 + 自動轉換至 Session 時區 | 11 Bytes | 資料庫統一儲存 UTC,顯示自動轉換 |
| INTERVAL YEAR TO MONTH | 年月間隔 | 5 Bytes | 年齡、期限計算 |
| INTERVAL DAY TO SECOND | 日時分秒間隔 | 11 Bytes | 精確持續時間 |
大物件 (LOB) 型態
| 型態 | 最大容量 | 儲存位置 | 適用場景 |
| BLOB | 4 GB ~ 128 TB (依區塊大小) | 資料庫內 (SecureFiles 建議) | 二進制檔案 (圖片、PDF、加密資料) |
| CLOB | 同 BLOB | 資料庫內 | 大型文字 (日誌、文章、XML/JSON 完整文件) |
| NCLOB | 同 BLOB | 資料庫內 | Unicode 大型文字 |
| BFILE | OS 檔案系統上限 | **資料庫外 (唯讀)** | 超大靜態檔案 (影片、備份檔),資料庫只存指標 |
特殊識別型態
| 型態 | 用途 | 長度 | 備註 |
| ROWID | 物理行地址 (檔案、區塊、槽號) | 10 Bytes (Extended) | 最快單行存取路徑,跨表不通用 |
| UROWID | 通用行識別碼 (含索引組織表、外部表) | 4,000 Bytes | 支援所有表類型,LOGICAL ROWID |
已棄用/不建議使用的型態
LONG / LONG RAW:單表僅 1 欄、無法索引、操作受限,**請改用 CLOB/BLOB**。
RAW(n):2,000 Bytes 內二進制,小量加密雜湊可用,大量改用 BLOB。
MLSLABEL:Trusted Oracle 專用,標準版無效。
選型口訣
「字串用 VARCHAR2、金額用 NUMBER(19,4)、時間戳用 TIMESTAMP(6) WITH LOCAL TIME ZONE、大文件用 SecureFiles LOB、行地址用 ROWID」