初期用 MySQL,隨用戶增長、數據量增大,MySQL 出現連線緩慢、宕機,需遷移至 Oracle。應用程式需同步修改。以下八大關鍵差異處理經驗。
-- 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, ...);
MySQL 允許雙引號包字串,Oracle 僅單引號。插入/修改前必須將所有單引號轉義為兩個單引號:' → ''。
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;
Oracle 單次 INSERT/UPDATE 字串 ≤ 4000 位元組。超長需用 CLOB 類型,配合 DBMS_LOB 套件操作。寫入前必做非空與長度檢查,超限報警回滾。
| MySQL | Oracle |
|---|---|
| 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 文檔。
MySQL NOT NULL 允許空字串 '',Oracle NOT NULL 禁止 NULL 與 ''。遷移時需將空字串轉為單空格 ' ' 或預設值,否則導入報錯。
MySQL/Oracle 均支援 LIKE,但無法用索引。Oracle 推薦:
INSTR(column, 'keyword') > 0
更精確且可利用索引(視索引類型)。
程序/函數結束時,確保釋放結果集與游標,避免洩漏。