前言
本文整理自 Robert Treat、Robert Hodges、Denish Patel、Roland Bouman 等專家總結的「MySQL 轉 Oracle 50 件事」,並補充實務修正與最佳實踐,涵蓋 SQL 語法、管理工具、效能調優、架構差異四大維度。
一、SQL 語法與功能差異(1-20)
- 分頁查詢:MySQL
LIMIT offset, rows → Oracle 用 ROWNUM 子查詢或 12c+ OFFSET ... FETCH NEXT。
- OFFSET 語法:Oracle 12c 前不支援標準
OFFSET。
- 複製技術:Oracle Data Guard/GoldenGate 功能強但配置複雜;MySQL Replication 輕量易維運。
- 多主架構:Oracle 推 RAC(共享儲存、高成本);MySQL NDB Cluster 或 Galera 更靈活。
- 分區表:Oracle 需 Enterprise Edition + Partitioning Option 額外授權;MySQL 內建免費。
- Linux 預裝:MySQL 多為發行版預裝;Oracle 需手動安裝配置。
- UPSERT:MySQL
INSERT ... ON DUPLICATE KEY UPDATE → Oracle MERGE(符合 SQL 標準但較繁瑣)。
- 角色體系:Oracle Role 與 Schema 綁定較緊密;MySQL 權限較扁平。
- 連線驗證:Oracle 使用專有協定(TCP/TCPS + TNS);MySQL 原生協定較簡單。
- 全文搜尋:語法完全不同,Oracle 用
CONTAINS / CTXSYS。
- 文檔與支援:Oracle 官方文檔詳盡,但進階支援需 My Oracle Support (Metalink) 付費帳號。
- 社群生態:非資料庫社群(PHP、Web 框架)對 Oracle 討論較少,自行解決問題難度較高。
- 自增欄位:MySQL
AUTO_INCREMENT → Oracle SEQUENCE + TRIGGER 或 12c IDENTITY 欄位。
- 中繼資料查詢:MySQL
SHOW TABLES、DESC → Oracle 查 USER_TABLES、USER_TAB_COLUMNS 等資料字典視圖。
- Information Schema:MySQL 多非標準擴展;Oracle 嚴格遵循 ANSI 標準,部分資訊需查動態效能視圖 (
V$)。
- 授權模型:Oracle 核心因子、Named User Plus、選項授權極其複雜,生產/非生產環境授權界線嚴格。
- 數值型別:Oracle 僅
NUMBER(p,s) 一種;MySQL 有 TINYINT、SMALLINT、MEDIUMINT、BIGINT 等細粒度型別。
- 表空間管理:Oracle 強制以 Tablespace 管理儲存;MySQL 單檔案/目錄較隨意。
- DDL 欄位順序:Oracle 不支援
ADD COLUMN ... BEFORE/AFTER;MySQL 支援。建議明確指定欄位清單而非 SELECT *。
- 管理工具:Oracle GUI (EM/Cloud Control) 強大;CLI
sqlplus 需適應期。MySQL CLI 體驗較現代。
- 資料驗證:Oracle 嚴格拒絕
'0000-00-00' 等非法日期;MySQL 寬鬆模式下允許,遷移時必須清洗髒資料。
二、進階開發與 PL/SQL 差異(21-35)
- PL/SQL 非標準:Oracle 不支援 SQL/PSM 標準語法,需學習專屬 PL/SQL。
- ENUM 型別:Oracle 無 ENUM,用
CHECK 约束 或 外鍵關聯表 替代。
- 特殊表類型:MySQL
BLACKHOLE、CSV → Oracle EXTERNAL TABLE 支援 CSV(11g+ 支援壓縮/加密)。
- GROUP BY 語意:Oracle 嚴格要求
SELECT 清單欄位必須出現在 GROUP BY 或聚合函數中;MySQL 預設寬鬆(ONLY_FULL_GROUP_BY 關閉時)。
- 匯出檔案:Oracle
EXPDP 生成二進制 .dmp 不可手工修改;MySQL mysqldump 產出純 SQL 文本可編輯。
- 底層架構:Oracle 必須理解 Undo/Redo、Checkpoint、DBWR、LGWR、CKPT 等背景進程;MySQL InnoDB 架構較簡化。
- 閉源限制:Oracle 無法自行修補核心、優化執行計畫、實現自定義功能。
- 查詢優化器:Oracle CBO 成熟複雜,大型應用需專職 DBA 調優;MySQL 優化器相對直觀。
- 統計資訊:Oracle CBO 高度依賴統計資訊,大表變更頻繁需定時
DBMS_STATS.GATHER_TABLE_STATS;MySQL 自動更新機制較激進。
- 連線成本:Oracle 建立連線昂貴,連線池為必須;MySQL 連線輕量,短連接可接受。
- 綁定變數:Oracle 強制要求 PreparedStatement + 綁定變數 以利游標共享;MySQL 較寬鬆。
- 游標管理:Oracle 未關閉 ResultSet 會爆
ORA-01000,屬應用 Bug;MySQL 較寬容。
- 長查詢風險:Oracle 易遇
ORA-01555 Snapshot too old,需調整 Undo Tablespace 大小與 Retention;MySQL MVCC 機制不同。
- 非事務表:Oracle 無對應概念(所有表皆事務化);MySQL
MyISAM、MEMORY 非事務。
- 臨時表:Oracle
GLOBAL TEMPORARY TABLE 定義持久、資料會話隔離;MySQL CREATE TEMPORARY TABLE 定義與資料皆會話級。
三、DDL 與管理操作差異(36-42)
- 多重 ALTER TABLE:Oracle 單條 DDL 僅能一項操作;MySQL 可
ALTER TABLE ... MODIFY ..., ADD ... 合併。
- 自動提交:Oracle 預設關閉自動提交(需顯式 COMMIT);MySQL 預設開啟。
- KILL 命令:Oracle 用
ALTER SYSTEM KILL SESSION 'sid,serial#';MySQL 用 KILL connection_id。
- ORDER BY 減號:Oracle
ORDER BY -col 無效;需用 ORDER BY col DESC。
- SQL*Plus 無語法高亮:建議改用 SQL Developer、DBeaver、VS Code 擴充套件。
- GROUP_CONCAT:Oracle 11gR2 前無內建,用
XMLAGG、自定義聚合或 12c LISTAGG。
- COUNT(DISTINCT 多欄位):Oracle 僅支援單一運算式,多欄位需子查詢
COUNT(DISTINCT (col1 || '|' || col2)) 或 COUNT(DISTINCT ROW(...))(12c+)。
四、進階功能與最佳實踐(43-50)
- 子查詢優化:Oracle 子查詢優化極佳,大膽使用 替代 MySQL 習慣的 JOIN 扁平化。
- 使用者變數:MySQL
@var → Oracle 用 分析函數 (SUM() OVER) 或 DBMS_SESSION.SET_CONTEXT 模擬。
- DATE 型別:Oracle
DATE 含時間(至秒),範圍較大;MySQL DATETIME 至微秒。12c+ 有 TIMESTAMP 更精確。
- 預存程序/觸發器:Oracle 功能強、效能佳,建議積極使用 封裝業務邏輯;MySQL 早期版本效能弱、功能少。
- 內建套件優先:撰寫 PL/SQL 前先查
DBMS_*、UTL_* 等內建套件,避免重造輪子。
- LOB 處理:Oracle
BLOB/CLOB 非透明化,需用 DBMS_LOB API 讀寫,效能較差(即使 11g SecureFiles);MySQL TEXT/BLOB 操作較直觀。
遷移專案關鍵建議
- 建立語法對照表:團隊共享,涵蓋 DDL、DML、函數、提示、管理命令。
- 資料清洗先行:特別處理非法日期、超長字串、ENUM 值映射。
- 效能基準測試:同等硬體跑核心業務 SQL,對比執行計畫、耗時、資源消耗。
- 綁定變數改造:應用層全面改用 PreparedStatement,消除硬解析。
- 連線池調優:根據 Oracle 連線特性調整池大小、驗證查詢、超時參數。
- 統計資訊策略:制定
DBMS_STATS 排程,關鍵表設定 METHOD_OPT => 'FOR ALL COLUMNS SIZE AUTO'。
- LOB 重構評估:大量 LOB 存取的模組考慮改為檔案系統 + 路徑存資料庫。
- 授權合規審查:確認 Enterprise Edition 選項(Partitioning、Advanced Compression、Active Data Guard 等)授權到位。
總結
MySQL → Oracle 遷移不僅是語法轉換,更是架構思維、運維體系、成本模型的全方位重塑。深入理解這 50 項差異背後的設計哲學,才能在遷移中避開陷阱,發揮 Oracle 企業級特性的最大價值。