許多專案初期採用 MySQL 輕量開發,隨著用戶增長與數據量激增,MySQL 漸露效能瓶頸:連接緩慢、頻繁宕機。此時將數據遷移至 Oracle 成為必然選擇,但兩者在架構與語法上存在顯著差異,應用層也需同步調整。本文整理八大核心遷移注意事項,助您平滑過渡。
MySQL 的 AUTO_INCREMENT 讓插入記錄無需指定主鍵值;Oracle 則需顯式建立 Sequence(序列) 並於 INSERT 時呼叫 NEXTVAL。
CREATE SEQUENCE seq_table_name
INCREMENT BY 1
START WITH 1
MAXVALUE 999999
NOCYCLE
NOCACHE;
-- 插入時使用
INSERT INTO table_name (id, col1) VALUES (seq_table_name.NEXTVAL, 'value');
提示:MAXVALUE 應依欄位長度設定(如 NUMBER(6) 設 999999),NOCACHE 可避免異常關機導致序號跳號。
MySQL 支援雙引號包裹字串,Oracle 僅接受單引號。寫入/更新前需將單引號 ' 替換為雙單引號 '',防止語法錯誤或注入風險。
MySQL LIMIT offset, count 簡潔直觀;Oracle 僅有 ROWNUM 偽欄,且只能用 ROWNUM < N,不可直接用 ROWNUM > M。推薦兩種通用寫法(假設主鍵為 ID):
SELECT id, col1, col2
FROM table_name
WHERE id IN (
SELECT id FROM (
SELECT ROWNUM AS rn, id
FROM table_name
WHERE condition1
ORDER BY condition2
)
WHERE rn > 80 AND rn < 100
)
ORDER BY condition3;
SELECT * FROM (
SELECT ROWNUM AS rn, c.*
FROM (
SELECT col1, col2
FROM table_name
WHERE condition1
ORDER BY condition2
) c
)
WHERE rn > 80 AND rn < 100
ORDER BY condition3;
Oracle VARCHAR2 單次 DML 限制 4000 位元組。超長文本請改用 CLOB,搭配 DBMS_LOB 套件操作。寫入前務必驗證非空與長度,異常時回滾並提示。
| 場景 | MySQL | Oracle |
|---|---|---|
| 型別 | DATE / TIME | DATE(含年月日時分秒) |
| 當前時間 | NOW() | SYSDATE(精確到秒) |
| 字串轉日期 | STR_TO_DATE() | TO_DATE('2001-08-01','YYYY-MM-DD') |
| 日期轉字串 | DATE_FORMAT() | TO_CHAR(date,'YYYY-MM-DD HH24:MI:SS') |
| 7 天前 | DATE_SUB(NOW(), INTERVAL 7 DAY) | SYSDATE - 7 |
遷移時需逐一替換日期函數與運算邏輯。
MySQL 允許 NOT NULL 欄位存空字串 '';Oracle 視空字串同等於 NULL,直接拒絕寫入。遷移腳本需將空字串轉為單空格 ' ' 或預設值,避免匯入失敗。
LIKE '%keyword%' 導致全表掃描,無法使用索引。Oracle 建議改用 INSTR(column, 'keyword') > 0,執行計劃更穩定,大數據量下效能提升明顯。
程序/函數結束前,務必顯式關閉 ResultSet、Statement、Connection,防止游標洩漏導致 ORA-01000: maximum open cursors exceeded。
MySQL 到 Oracle 的遷移不只是語法替換,更涉及資料型別、空值語義、分頁邏輯、日期運算等深層差異。建議建立完整測試集,分模組驗證,並利用 SQL Developer 或 Ora2Pg 等工具輔助,確保業務零縫隙切換。