當團隊決定將資料庫從 MySQL 遷移至 Oracle 時,往往會遭遇諸多意想不到的差異。這份整理自資深專家 Robert Treat、Robert Hodges、Denish Patel 與 Roland Bouman 見解的清單,雖然部分觀點帶有 MySQL DBA 的視角,甚至有些項目略顯湊數,但綜合來看仍能幫助開發者快速掌握兩大資料庫在架構、語法、管理與效能調校上的核心差異。
LIMIT 與 OFFSET,需改用 ROWNUM 偽欄或 ROW_NUMBER() OVER() 分析函數實現,寫法較繁瑣。INSERT ... ON DUPLICATE KEY UPDATE 需改寫為符合 SQL 標準的 MERGE 語句,邏輯更嚴謹但複雜度提高。AUTO_INCREMENT,必須結合 SEQUENCE 與 TRIGGER 手動實現。ALTER TABLE ADD COLUMN 不支援 BEFORE/AFTER 指定位置,理論上不應依賴欄位順序,應在 SELECT/INSERT 中明確列出欄位名。SELECT 清單中所有非聚合欄位必須出現在 GROUP BY 子句中,否則報錯。GROUP_CONCAT,早期版本需用游標迴圈或 XMLAGG,11gR1 起提供 LISTAGG。TIME 型別,DATE 實際為 DATETIME,且支援更大年份範圍。CHECK 約束或外鍵關聯表替代。@var,改用分析函數(窗口函數)或 DBMS_SESSION.SET_CONTEXT 實現會話級變數。NUMBER(p,s),若需 MySQL 多種整數/浮點型別,需自行透過精度控制模擬。BLOB/CLOB 非透明實體化,單純當文本處理時需大量 DBMS_LOB API,效率較低(即使 11g SecureFile 仍有改善空間)。BLACKHOLE、CSV 引擎在 Oracle 無對應;外部表(EXTERNAL TABLE)支援 CSV,11g 更支援壓縮/加密。'0000-00-00' 等非法日期,遷移前必須清洗髒資料。DBA、CONNECT、RESOURCE)含預定義權限集,亦可自訂 Role。COMMIT,應用層需注意事務邊界。ALTER SYSTEM KILL SESSION,OS 層面 kill -9 仍可用但不建議。SQL*Plus 功能強大但學習曲線陡峭,習慣 MySQL CLI 的開發者初期會不適應;圖形工具(SQL Developer、TOAD、PL/SQL Developer)體驗較佳。DBA_*、ALL_*、USER_* 視圖)與動態效能視圖(V$*)。EXP/IMP 產出的 .dmp 為二進位格式,不可像 MySQL mysqldump 那樣手工修改;Data Pump(EXPDP/IMPDP)是現代替代方案。ALTER TABLE 子句,需拆分執行。DBMS_STATS.GATHER_TABLE_STATS,否則易產生惡劣執行計畫。PreparedStatement(綁定變數)會導致共用池洪水、硬解析風暴,是 Oracle 應用鐵律。ResultSet/游標會觸發 ORA-01000,屬應用層 Bug,需修代碼而非調參數。Snapshot too old,需調整 UNDO_RETENTION 與 Undo 表空間大小,而非 Redo Segment。GLOBAL TEMPORARY TABLE 定義對所有 Session 可見,資料才是 Session 級隔離,與 MySQL CREATE TEMPORARY TABLE 定義與資料皆 Session 級不同。DBMS_*、UTL_* 等內建套件,九成需求已有現成 API。遷移不只是語法轉換,更是思維模式的重構。建議團隊:
1. 先建立效能基準線,量化 SLAs;
2. 投資 DBA 培訓,特別是 CBO、統計資訊、Undo/Redo、RAC 架構;
3. 採用 Data Pump、SQL Plan Baseline、Real Application Testing 降低風險;
4. 應用層強制綁定變數、連線池、游標管理三件套;
5. 預算中納入 Enterprise Edition 必選項(分區、壓縮、Advanced Security 等)與年費 22% 的維護費。
這 50 項差異涵蓋了從開發習慣到架構決策的完整光譜。逐項攻克,方能在 Oracle 生態中行穩致遠。