彙總對比表
| # | 項目 | Oracle | MySQL | 遷移要點 |
| 1 | 聚合函數與 GROUP BY | SELECT 列必須在 GROUP BY 或聚合函數中 | 允許非 GROUP BY 列 (ONLY_FULL_GROUP_BY 可關閉) | 遷移前開啟 ONLY_FULL_GROUP_BY 檢查 |
| 2 | 自增/序列 | SEQUENCE + NEXTVAL | AUTO_INCREMENT / 8.0+ SEQUENCE | 改寫 INSERT 邏輯或建 SEQUENCE |
| 3 | 字串引號 | 僅單引號,單引號轉義為 '' | 單/雙引號皆可,\'' 轉義 | 統一單引號,應用層轉義 |
| 4 | 分頁語法 | ROWNUM 子查詢嵌套複雜 | LIMIT offset, rows / OFFSET FETCH | 改寫為 LIMIT,效能提升 |
| 5 | 長字串 (CLOB/TEXT) | >4000 需 DBMS_LOB | TEXT/LONGTEXT 直寫 | 簡化應用層邏輯 |
| 6 | 日期時間 | DATE 含時分秒,SYSDATE,TO_DATE/TO_CHAR 格式豐富 | DATE/TIME/DATETIME/TIMESTAMP,NOW(),DATE_FORMAT | 型別對應、函數改寫、時區處理 |
| 7 | 空值語意 | NOT NULL 真正禁止 NULL | NOT NULL 允許空字串/零值 | 匯入前清洗空字串→NULL |
| 8 | 模糊查詢 | LIKE '%str%' 不走索引,INSTR() 較快 | LIKE '%str%' 同,全文索引/ngram 解決 | 全文檢索遷移至 Elasticsearch |
| 9 | 游標/結果集釋放 | 嚴格要求關閉 | 較寬鬆,但連線池洩漏風險 | 應用層統一 try-with-resources |
深度解析重點差異
分頁:Oracle 複雜 vs MySQL 簡單
-- Oracle 12c+ 簡化
SELECT * FROM t ORDER BY id OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;
-- MySQL
SELECT * FROM t ORDER BY id LIMIT 20, 10;
-- 或 8.0+
SELECT * FROM t ORDER BY id LIMIT 10 OFFSET 20;
日期處理:函數映射表
| 功能 | Oracle | MySQL |
| 當前日期時間 | SYSDATE | NOW() / CURRENT_TIMESTAMP |
| 日期格式化 | TO_CHAR(dt, 'YYYY-MM-DD HH24:MI:SS') | DATE_FORMAT(dt, '%Y-%m-%d %H:%i:%s') |
| 字串轉日期 | TO_DATE('2024-01-01', 'YYYY-MM-DD') | STR_TO_DATE('2024-01-01', '%Y-%m-%d') |
| 日期加減 | SYSDATE - 7 / ADD_MONTHS | DATE_SUB(NOW(), INTERVAL 7 DAY) / DATE_ADD |
| 截取日期 | TRUNC(SYSDATE) | DATE(NOW()) |
空字串與 NULL
-- Oracle: '' 等同 NULL
INSERT INTO t (col) VALUES (''); -- 實際存 NULL
-- MySQL: '' 是空字串,非 NULL
INSERT INTO t (col) VALUES (''); -- 存空字串
-- 遷移時需決定業務語意,統一轉換
遷移工具與策略
- SQL Developer Migration Workbench:官方免費,支援 Schema/Code/資料遷移
- AWS SCT / Azure DMS:雲遷移評估與轉換
- pt-online-schema-change:大表線上結構同步
- 驗證步驟:行數核對、檢查和約束、應用端回歸測試、效能基準對比