專案需將 Oracle 開發的產品移植至客戶 MySQL 環境。遷移過程中遭遇五大核心差異:大小寫敏感、保留字衝突、資料類型對應、自增機制、索引長度限制。本文詳細記錄每個問題的現象、根因與解決方案,並總結資料庫相容性設計原則。
| 場景 | Oracle | MySQL (Linux) |
|---|---|---|
| 表名/欄位名 | 不區分大小寫 (內部轉大寫) | 嚴格區分大小寫 (對應檔案系統) |
| 工具匯出 DDL | 通常產生大寫 | 需手動調整為應用程式 SQL 一致的大小寫 |
解決:統一資料庫、DDL、應用程式 SQL 三端大小寫 (建議全小寫);若應用程式 SQL 大小寫混用,需逐一修正。
Oracle 允許保留字作表名/欄位名 (如 INT, SHOW),MySQL 直接報語法錯誤。
解決:
INSERT INTO T (ID, \`INTERVAL\`) VALUES (...)T.INTERVAL_INTERVAL| Oracle | MySQL | 備註 |
|---|---|---|
| VARCHAR2(n) | VARCHAR(n) | MySQL 5.0+ VARCHAR 支援 65535 位元組 |
| NUMBER(p,s) | DECIMAL(p,s) / NUMERIC(p,s) | 精確數值 |
| DATE | DATETIME | Oracle DATE 含時間,MySQL DATE 僅日期 |
| TIMESTAMP | TIMESTAMP | 注意時區處理差異 |
| CLOB | LONGTEXT | 4GB → 4GB |
| BLOB | LONGBLOB | |
| - | TIME | MySQL 獨有,Oracle 無對應 |
| 特性 | Oracle | MySQL |
|---|---|---|
| 機制 | SEQUENCE + TRIGGER | AUTO_INCREMENT |
| 取得新 ID | SEQ.NEXTVAL 或 RETURNING INTO | LAST_INSERT_ID() |
| 遷移策略 | 將 SEQUENCE 改為 AUTO_INCREMENT;若業務需跨表唯一 ID,建立單獨 ID 產生表 | |
innodb_large_prefix 可達 3072)解決:縮短索引欄位長度、使用前綴索引 INDEX (COL(100))、改用 utf8mb4 注意 4 位元組/字元。
_ 前綴PageRequest 物件,由具體 Dialect 實現 (MySQL LIMIT、Oracle ROWNUM、PG OFFSET/FETCH)Long id,持久層處理 SEQUENCE/AUTO_INCREMENT/IDENTITY 差異VARCHAR2→VARCHAR, NUMBER→DECIMAL, SEQUENCE→AUTO_INCREMENT 等Oracle → MySQL 遷移不只是語法轉換,更是架構相容性的驗證。若初期設計遵循「標準 SQL + 抽象層 + 命名規範」,遷移成本可降至極低。建議團隊建立「資料庫無關性檢查清單」納入 Code Review 流程。