Oracle DATE 含「年月日時分秒」;DB2 拆分為 DATE(年月日)、TIME(時分秒)、TIMESTAMP(年月日時分秒.微秒)。遷移必須按業務語義拆分或合併。
| Oracle | DB2 (LUW) | DB2 for i (DB2/400) | 遷移注意事項 |
|---|---|---|---|
DATE | TIMESTAMP (推薦)DATE + TIME (分離) | DATE + TIMETIMESTAMP | 用 TO_CHAR(date_col, 'YYYY-MM-DD') 對應 DB2 DATE用 TO_CHAR(date_col, 'HH24:MI:SS') 對應 DB2 TIME |
TIMESTAMP | TIMESTAMP / TIMESTAMP(12) | TIMESTAMP | 精度對齊:Oracle 6 位微秒,DB2 默認 6 位,可擴至 12 |
VARCHAR2(n) n≤4000 | VARCHAR(n) n≤32672 | VARCHAR(n) n≤32740 | DB2 上限大得多,直接映射;超長用 CLOB |
CHAR(n) n≤2000 | CHAR(n) n≤254 | CHAR(n) n≤254 | 定長字符 DB2 上限較小,超長改 VARCHAR |
LONG | CLOB / VARCHAR(32672) | CLOB / VARCHAR(32740) | Oracle LONG 已棄用,遷移統一用 CLOB |
CLOB | CLOB (1GB~2GB) | CLOB (2GB) | 直接映射;注意 DB2 CLOB 存儲需大表空間 |
BLOB | BLOB | BLOB | 直接映射 |
RAW(n) / LONG RAW | BLOB / VARCHAR(n) FOR BIT DATA | BLOB / VARCHAR FOR BIT DATA | 二進制數據用 BLOB;小片段可用 FOR BIT DATA |
NUMBER(p,s) | DECIMAL(p,s) / NUMERIC(p,s) | DECIMAL(p,s) / NUMERIC(p,s) | 精度/標度完全對應;純整數用 SMALLINT/INT/BIGINT |
NUMBER (無精度) | DECIMAL(31,*) / DOUBLE | DECIMAL(31,*) / DOUBLE | 按業務實際精度收窄;浮點運算用 DOUBLE/REAL |
FLOAT(n) / BINARY_FLOAT/DOUBLE | DOUBLE / REAL | DOUBLE / REAL | IEEE 754 雙精度/單精度 |
ROWID / UROWID | ROWID (隱含) | ROWID | DB2 隱含 RID,不直接暴露;遷移忽略或用主鍵替代 |
XMLTYPE | XML (pureXML) | XML | 功能對等,DB2 pureXML 支援 XQuery/索引更強 |
-- Oracle: NUMBER(10,2) -- 金額
-- DB2: DECIMAL(10,2) -- 精確對應
-- Oracle: NUMBER(38) -- 大整數
-- DB2: BIGINT -- -9.22E18 ~ 9.22E18,性能最優
-- 或 DECIMAL(31,0) -- 超大整數
-- Oracle: NUMBER -- 浮點
-- DB2: DOUBLE -- 8 字節雙精度
VARCHAR2(100 CHAR) 按字符計長;DB2 VARCHAR(100) 按字節 (UTF-8 下 1 中文=3 字節)。VARCHAR2(n CHAR) → VARCHAR(n * 3) (UTF-8) 或啟用 CODEUNITS32 (V10.5+) 按字符計長。Oracle '' = NULL;DB2 '' ≠ NULL (空串)。遷移時:
NULLCHECK (col <> '' OR col IS NULL) 約束sed/awk 批量替換類型。DATE/TIMESTAMP 列業務語義對齊 (時區、精度)建立標準化類型映射字典,納入遷移項目「定義階段」交付物,可消除 90% 類型相關缺陷。