專案早期用 MySQL,隨用戶增長遭遇效能瓶頸,需遷移至 Oracle。應用程式需同步修改 SQL 與資料存取邏輯。
| 項目 | MySQL | Oracle | 處理建議 |
|---|---|---|---|
| 1. 自增欄位 | AUTO_INCREMENT |
無內建,需 CREATE SEQUENCE seq_name INCREMENT BY 1 START WITH 1 MAXVALUE 999999 NOCACHE;,INSERT 時用 SEQ_NAME.NEXTVAL |
建立序列對應每張表,INSERT 觸發器或應用層賦值 |
| 2. 字串引號 | 單引號、雙引號皆可 | 僅單引號 | 寫入前將單引號轉義為兩個單引號 '' |
| 3. 分頁查詢 | LIMIT offset, count |
無 LIMIT,需用 ROWNUM 子查詢 |
推薦寫法:SELECT * FROM (SELECT ROWNUM RN, T.* FROM (SELECT ... ORDER BY ...) T WHERE ROWNUM <= :end) WHERE RN > :start |
| 4. 長字串 | TEXT/BLOB 直接寫入 |
VARCHAR2 最大 4000 位元組,超過需用 CLOB + DBMS_LOB 套件 |
寫入前檢查長度,超長改用 CLOB 流式寫入 |
| 5. 日期型別 | DATE、TIME 分離 |
單一 DATE 含年月日時分秒 |
系統時間用 SYSDATE;字串轉日期 TO_DATE('2001-08-01','YYYY-MM-DD');日期轉字串 TO_CHAR(...);日期運算 SYSDATE - 7 表示 7 天前 |
| 6. 空字串處理 | NOT NULL 欄位可存空字串 |
NOT NULL 禁止空字串(視同 NULL) |
匯入前將空字串轉為一個空格 ' ' 或預設值 |
| 7. 模糊查詢效能 | LIKE '%str%' |
同語法,但無法用索引 | 改用 INSTR(COL, 'str') > 0 可利用函數索引或全文檢索 |
| 8. 資源釋放 | 較寬鬆 | 嚴格要求關閉 ResultSet、Statement、Connection |
程式碼中確保 finally 區塊釋放所有 JDBC 資源 |