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

MySQL 遷移 Oracle 七大關鍵差異與轉換對照表

     編輯:MySQL 資料庫相關知識

1. 自增主鍵:AUTO_INCREMENT vs SEQUENCE


-- MySQL
CREATE TABLE t (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20));

-- Oracle
CREATE SEQUENCE seq_t_id INCREMENT BY 1 START WITH 1 MAXVALUE 999999 NOCACHE;
CREATE TABLE t (id NUMBER(6) PRIMARY KEY, name VARCHAR2(20));
-- 插入時
INSERT INTO t (id, name) VALUES (seq_t_id.NEXTVAL, 'abc');
-- 或建立觸發器自動填入
CREATE TRIGGER trg_t_bir BEFORE INSERT ON t FOR EACH ROW
BEGIN SELECT seq_t_id.NEXTVAL INTO :NEW.id FROM dual; END;

2. 字串引號:雙引號 vs 單引號

  • MySQL:"abc"、'abc' 皆可(ANSI_QUOTES 模式下雙引號為識別符)。
  • Oracle:僅單引號'abc',雙引號為識別符。
  • 遷移時:' → ''(單引號轉義)。

3. 分頁查詢:LIMIT vs ROWNUM


-- MySQL
SELECT * FROM t ORDER BY id LIMIT 20, 10;  -- 第 21-30 筆

-- Oracle 寫法一(子查詢 + ROWNUM)
SELECT * FROM (
    SELECT a.*, ROWNUM rn FROM (
        SELECT * FROM t ORDER BY id
    ) a WHERE ROWNUM <= 30
) WHERE rn > 20;

-- Oracle 寫法二(內聯視圖)
SELECT * FROM (
    SELECT ROWNUM rn, b.* FROM (
        SELECT * FROM t ORDER BY id
    ) b WHERE ROWNUM <= 30
) WHERE rn > 20;

Oracle 12c+ 支援 OFFSET ... ROWS FETCH NEXT ... ROWS ONLY 標準語法。

4. 長字串:TEXT/BLOB vs CLOB/BLOB

  • MySQL TEXT 最大 64KB,LONGTEXT 4GB。
  • Oracle VARCHAR2 最大 4000 位元組,超過需用 CLOB。
  • 插入 > 4000 位元組時,必須用 DBMS_LOB 套件:
    DBMS_LOB.WRITEAPPEND(lob_loc, amount, buffer);

5. 日期時間:DATE/TIMESTAMP vs DATE

6. 空值處理:空字串 vs NULL

  • MySQL:NOT NULL 欄位可插入空字串 ''。
  • Oracle:NOT NULL 欄位**不可**為 NULL 也不可為空字串(Oracle 視空字串為 NULL)。
  • 遷移時:'' → ' '(單空格)或保持 NULL,視業務而定。

7. 模糊查詢:LIKE vs INSTR


-- MySQL
WHERE name LIKE '%abc%'

-- Oracle
WHERE name LIKE '%abc%'          -- 不走索引
WHERE INSTR(name, 'abc') > 0     -- 同樣不走索引,但語意更明確
-- 若需索引:Oracle Text (CTXSYS.CONTAINS) 或 Function-based Index

補充:程式碼層面注意

  • JDBC 驅動更換:mysql-connector-java → ojdbc8.jar。
  • 連線池配置:validationQuery Oracle 用 SELECT 1 FROM dual。
  • 結果集/Statement 關閉:Oracle 較嚴格,務必 finally 區塊釋放。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
功能MySQLOracle
當前時間NOW()SYSDATE(精確到秒)
字串轉日期STR_TO_DATE('2021-01-01','%Y-%m-%d')TO_DATE('2021-01-01','YYYY-MM-DD')
日期轉字串DATE_FORMAT(dt,'%Y-%m-%d')TO_CHAR(dt,'YYYY-MM-DD')
日期運算(7 天前)dt > DATE_SUB(NOW(), INTERVAL 7 DAY)dt > SYSDATE - 7