首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 遷移 Oracle 關鍵差異處理指南:八大遷移陷阱與解決方案

     編輯:MySQL 資料庫相關知識

遷移背景

初期用 MySQL,隨用戶增長、數據量增大,MySQL 出現連線緩慢、宕機,需遷移至 Oracle。應用程式需同步修改。以下八大關鍵差異處理經驗。

1. 自增欄位:Sequence 替代 AUTO_INCREMENT

-- Oracle 建立序列
CREATE SEQUENCE seq_table_name
  INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE;
-- MAXVALUE 依欄位長度設定,如 NUMBER(6) → 999999
-- 插入時使用
INSERT INTO table (id, ...) VALUES (seq_table_name.NEXTVAL, ...);

2. 字串引號:雙引號 → 單引號 + 轉義

MySQL 允許雙引號包字串,Oracle 僅單引號。插入/修改前必須將所有單引號轉義為兩個單引號:' → ''。

3. 分頁查詢:ROWNUM 處理

MySQL:LIMIT offset, rows。Oracle:ROWNUM 偽欄位,只能 ROWNUM < 100 不能 >。兩種優化寫法(ID 為唯一鍵):

-- 寫法一
SELECT id, cols FROM table
WHERE id IN (
  SELECT id FROM (
    SELECT ROWNUM AS rn, id FROM table WHERE cond1 ORDER BY cond2
  ) WHERE rn > 80 AND rn < 100
) ORDER BY cond3;

-- 寫法二
SELECT * FROM (
  SELECT ROWNUM AS rn, c.* FROM (
    SELECT cols FROM table WHERE cond1 ORDER BY cond2
  ) c
) WHERE rn > 80 AND rn < 100 ORDER BY cond3;

4. 長字串:CLOB + DBMS_LOB

Oracle 單次 INSERT/UPDATE 字串 ≤ 4000 位元組。超長需用 CLOB 類型,配合 DBMS_LOB 套件操作。寫入前必做非空與長度檢查,超限報警回滾。

5. 日期時間:SYSDATE 與 TO_DATE/TO_CHAR

MySQLOracle
DATE / TIME 分離DATE 含年月日時分秒
NOW()SYSDATE(精確到秒)
字串轉日期TO_DATE('2001-08-01','YYYY-MM-DD')
日期轉字串TO_CHAR(date,'YYYY-MM-DD HH24:MI:SS')
7天前date_col > SYSDATE - 7

格式模板詳見 Oracle 文檔。

6. 空值處理:NOT NULL 真正禁止空字串

MySQL NOT NULL 允許空字串 '',Oracle NOT NULL 禁止 NULL 與 ''。遷移時需將空字串轉為單空格 ' ' 或預設值,否則導入報錯。

7. 模糊查詢:INSTR 替代 LIKE 利用索引

MySQL/Oracle 均支援 LIKE,但無法用索引。Oracle 推薦:
INSTR(column, 'keyword') > 0
更精確且可利用索引(視索引類型)。

8. 資源釋放:游標與結果集必須顯式關閉

程序/函數結束時,確保釋放結果集與游標,避免洩漏。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved