異構資料庫遷移或雙資料庫支援專案中,Oracle 與 MySQL 的語法與語義差異是 Bug 溫床。本文梳理 7 大核心差異類別,附對比表與遷移建議,助開發者寫出可移植 SQL 或快速定位遷移問題。
一、聚合函數與 GROUP BY 語義
| 場景 | MySQL | Oracle | 遷移對策 |
| SELECT 含聚合函數與非聚合欄位 | 允許 (ONLY_FULL_GROUP_BY 關閉時),任意取值 | 報錯 ORA-00979,非聚合欄位必須在 GROUP BY 中 | 嚴格遵循 ANSI SQL:所有非聚合欄位納入 GROUP BY 或包裹聚合函數 |
二、自增主鍵實現
| 特性 | MySQL | Oracle |
| 語法 | AUTO_INCREMENT | Sequence + Trigger / Identity Column (12c+) |
| 插入行為 | 自動填充,無需指定 | 需 .NEXTVAL 或 DEFAULT ON NULL |
| 遷移建議 | Oracle 12c+ 使用 GENERATED AS IDENTITY;舊版建立 Sequence + BEFORE INSERT Trigger |
三、字串引號規範
- MySQL:支援雙引號
"string" (預設 ANSI_QUOTES 關閉)
- Oracle:僅支援單引號'string',雙引號用於識別符 (大小寫敏感表名/欄位名)
- 遷移:統一使用單引號,識別符雙引號僅在需保留大小寫時使用
四、分頁查詢語法
| 資料庫 | 語法 | 範例 (第 2 頁,每頁 10 筆) |
| MySQL | LIMIT offset, count | SELECT * FROM t LIMIT 10, 10 |
| Oracle (12c-) | ROWNUM 雙層嵌套 | SELECT * FROM (SELECT t.*, ROWNUM rn FROM t) WHERE rn BETWEEN 11 AND 20 |
| Oracle (12c+) | OFFSET ... FETCH | SELECT * FROM t OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY |
五、日期時間型別與函數
| 特性 | MySQL | Oracle |
| 型別 | DATE (僅日期)、DATETIME/TIMESTAMP (日期時間) | 單一 DATE 含日期時間 (秒精度),TIMESTAMP 含時區/微秒 |
| 當前時間 | NOW(), SYSDATE() | SYSDATE (Session 時區), SYSTIMESTAMP (微秒+時區) |
| 字串轉日期 | STR_TO_DATE('2001-08-01','%Y-%m-%d') | TO_DATE('2001-08-01','YYYY-MM-DD') |
六、空值與空字串語義
| 場景 | MySQL | Oracle | 遷移風險 |
NOT NULL 欄位插入 '' | 允許 (空字串 ≠ NULL) | 報錯 ORA-01400 (空字串視同 NULL) | MySQL 導出資料含空字串,Oracle 匯入失敗 |
| 對策 | ETL 階段將 '' 轉為 ' ' (單空格) 或預設值 |
七、模糊查詢效能差異
- 語法相同:
col LIKE '%keyword%'
- MySQL:無函數替代,依賴全文索引
- Oracle:
INSTR(col, 'keyword') > 0 可利用索引 (函數索引),效能優於 LIKE 導頭萬用字元
- 建議:Oracle 偏好
INSTR 或 CTXSYS.CONTEXT 全文索引
八、遷移檢查清單
[ ] 聚合查詢 GROUP BY 完整性
[ ] 自增主鍵 → Sequence/Identity
[ ] 雙引號字串 → 單引號
[ ] LIMIT → ROWNUM/OFFSET FETCH
[ ] NOW()/STR_TO_DATE → SYSDATE/TO_DATE
[ ] 空字串 '' → ' ' 或預設值
[ ] LIKE '%...%' → INSTR() > 0
[ ] 數據類型映射 (TINYINT→NUMBER(3), MEDIUMTEXT→CLOB 等)
[ ] 鎖提示 (NOLOCK/UPDLOCK → FOR UPDATE/ISOLATION LEVEL)
[ ] 儲存過程/觸發器語法重寫 (PL/SQL vs MySQL Stored Program)
系統性對比差異,建立遷移規範與自動化改寫腳本,是異構資料庫專案成功的關鍵。
- 上一篇文章: MySQL JDBC 驅動類名演進:org.gjt.mm.mysql.Driver vs com.mysql.jdbc.Driver 兼容性說明
- 下一篇文章: SQL 與 Oracle NULL 值深度解析:比較規則、函數處理、索引影響、排序行為、動態 SQL 綁定陷阱
Copyright ©
程式碼之家 All Rights Reserved