異構資料庫遷移 (SQL Server ↔ Oracle) 時,資料類型對應是 Schema 轉換的核心。本文提供雙向完整對照表、精度/長度/語意差異說明、遷移陷阱與自動化工具建議。
| SQL Server 型別 | 長度/精度 | Oracle 對應型別 | 備註 |
|---|---|---|---|
| bigint | 8 bytes | NUMBER(19) | -2^63 ~ 2^63-1 |
| binary(n) | n ≤ 8000 | RAW(n) | 固定長度二進位 |
| bit | 1 bit | NUMBER(1) 或 CHAR(1) 'Y'/'N' | Oracle 無布林型別 |
| char(n) | n ≤ 8000 | CHAR(n [BYTE/CHAR]) | 注意語意:BYTE vs CHAR |
| date | 3 bytes | DATE | SQL Server date 僅日期,Oracle DATE 含時間 |
| datetime | 8 bytes | DATE 或 TIMESTAMP(3) | 精度 3.33ms vs 1ns |
| datetime2(n) | 6-8 bytes | TIMESTAMP(n) | 建議映射 TIMESTAMP |
| datetimeoffset(n) | 8-10 bytes | TIMESTAMP(n) WITH TIME ZONE | |
| decimal(p,s) / numeric(p,s) | p ≤ 38 | NUMBER(p,s) | 完全相容 |
| float(n) | 24/53 bits | BINARY_DOUBLE | IEEE 754 雙精度 |
| real | 24 bits | BINARY_FLOAT | IEEE 754 單精度 |
| image | 2^31-1 bytes | BLOB | 已棄用,SQL Server 建議 varbinary(max) |
| int | 4 bytes | NUMBER(10) | -2^31 ~ 2^31-1 |
| money / smallmoney | 8/4 bytes | NUMBER(19,4) / NUMBER(10,4) | 固定 4 位小數 |
| nchar(n) / nvarchar(n) | n ≤ 4000 | NCHAR(n) / NVARCHAR2(n) | Unicode (UTF-16) |
| ntext | 2^30-1 chars | NCLOB | 已棄用,建議 NVARCHAR2(MAX) |
| smalldatetime | 4 bytes | DATE | 精度 1 分鐘 |
| smallint | 2 bytes | NUMBER(5) | -32768 ~ 32767 |
| sql_variant | 8016 bytes | 無直接對應 | 建議拆分多欄位或用 JSON/XML |
| text | 2^31-1 chars | CLOB | 已棄用,建議 VARCHAR2(MAX) / CLOB |
| time(n) | 3-5 bytes | INTERVAL DAY TO SECOND(n) | 或 VARCHAR2 存 ISO 格式 |
| timestamp / rowversion | 8 bytes | RAW(8) / NUMBER | 非日期時間,為版本戳 |
| tinyint | 1 byte | NUMBER(3) | 0 ~ 255 |
| uniqueidentifier | 16 bytes | RAW(16) 或 CHAR(32) | GUID,建議 RAW(16) 存二進位 |
| varbinary(n/max) | n ≤ 8000 / max | RAW(n) / BLOB | |
| varchar(n/max) | n ≤ 8000 / max | VARCHAR2(n [BYTE/CHAR]) / CLOB | MAX → CLOB |
| xml | -- | XMLType | 原生 XML 支援 |
| hierarchyid | -- | 無直接對應 | 建議 VARCHAR2 存路徑字串或拆分欄位 |
| geometry / geography | -- | SDO_GEOMETRY (Spatial) | 需 Oracle Spatial/Locator |
| Oracle 型別 | SQL Server 對應型別 | 備註 |
|---|---|---|
| BINARY_DOUBLE | float(53) | |
| BINARY_FLOAT | real | |
| BLOB | varbinary(max) | |
| CLOB / NCLOB | varchar(max) / nvarchar(max) | |
| CHAR(n [BYTE/CHAR]) | nchar(n) / char(n) | BYTE/CHAR 語意差異 |
| DATE | datetime2(0) / datetime | 含時間元件 |
| TIMESTAMP(n) | datetime2(n) | |
| TIMESTAMP(n) WITH TIME ZONE | datetimeoffset(n) | |
| TIMESTAMP(n) WITH LOCAL TIME ZONE | datetimeoffset(n) | 應用層處理時區 |
| INTERVAL DAY TO SECOND | varchar(30) / 時間存秒數 | 無原生對應 |
| INTERVAL YEAR TO MONTH | varchar(14) / 存月數 | 無原生對應 |
| LONG / LONG RAW | varchar(max) / varbinary(max) | 已棄用,遷移時轉 CLOB/BLOB |
| NCHAR(n) / NVARCHAR2(n) | nchar(n) / nvarchar(n) | |
| NUMBER(p,s) | decimal(p,s) | p>38 需拆分 |
| NUMBER (無精度) | decimal(38,*) / float | 視實際資料範圍 |
| RAW(n) | varbinary(n) | |
| ROWID / UROWID | char(18) / binary(16) | 不建議遷移 |
| VARCHAR2(n [BYTE/CHAR]) | nvarchar(n) / varchar(n) | BYTE/CHAR 注意 |
| XMLType | xml | |
| SDO_GEOMETRY | geometry / geography | 需 SQL Server Spatial |
| 議題 | SQL Server | Oracle | 處理策略 |
|---|---|---|---|
| 字元長度語意 | 永遠以位元組計 | CHAR/BYTE vs CHAR 語意 (NLS_LENGTH_SEMANTICS) | 遷移時統一用 CHAR 語意,或依實際資料長度計算位元組上限 |
| 日期時間精度 | datetime 3.33ms, datetime2 100ns | DATE 1秒, TIMESTAMP 1ns | 映射至 datetime2/TIMESTAMP 保留精度 |
| 空字串 vs NULL | '' ≠ NULL | '' = NULL | 應用層邏輯需調整,或用 ' ' 代替空字串 |
| 大小寫敏感度 | 依 Collation (預設 CI) | 預設敏感 (二進位比較) | 建立語言索引 (NLS_COMP=LINGUISTIC) 或應用層統一大小寫 |
| 自動編號 | IDENTITY | Sequence + Trigger / Identity Column (12c+) | 12c+ 用 GENERATED AS IDENTITY,舊版建 Sequence+Trigger |
| 資料列版本 | ROWVERSION / timestamp | ORA_ROWSCN / 觸發器維護版本欄 | 樂觀鎖邏輯需重寫 |
| JSON 支援 | JSON 函數 (2016+) | JSON 函數 (12c+), JSON 資料型別 (21c+) | 語法不同,查詢需改寫 |
資料類型映射只是遷移第一步;語意差異、應用邏輯改寫、效能基準測試才是成敗關鍵。建議採「工具生成骨架 → 專家審查調整 → 分批驗證 → 全量遷移」四階段策略。