將生產環境從 Oracle 遷移至 MySQL 是常見架構調整,但兩者在 SQL 標準實作、資料型別、大小寫敏感度、保留字處理等方面存在顯著差異。本文歸納實戰中遇到的五大核心問題與解決方案,並提出資料庫設計階段即應遵循的三大相容性原則,助你實現平滑遷移。
Oracle:預設不區分大小寫,表名/欄位名未加雙引號時視為大寫。
MySQL:取決於作業系統。Linux/Unix 下資料庫對應目錄、表對應檔案,因此區分大小寫;Windows 則不區分。
解決方案:統一遷移後的資料庫名、表名與應用程式 SQL 字串中的大小寫;若應用程式 SQL 字串大小寫混用,需逐一修正。
Oracle 允許保留字(如 interval、show)作為表名/欄位名。
MySQL 嚴格禁止,直接報語法錯誤。
解決方案:使用反引號 ` 包裹保留字(鍵盤 Tab 上方),或採用 tablename.columnname 完整限定名。
範例:INSERT INTO t (id, `interval`) VALUES (...) 或 INSERT INTO t (id, t.interval) VALUES (...)
| Oracle | MySQL 對應 |
|---|---|
| VARCHAR2 | VARCHAR |
| NUMBER | NUMERIC / DECIMAL |
| 無對應 | TIME |
解決方案:建表腳本中直接替換型別。
Oracle:使用 SEQUENCE + TRIGGER 或應用層取值。
MySQL:原生 AUTO_INCREMENT 欄位屬性。
解決方案:將 SEQUENCE 改為 AUTO_INCREMENT;極少數複雜場景可建立獨立序號表模擬。
MySQL 4.1.2+:MyISAM/InnoDB 索引長度上限 1000 位元組。UTF-8 下每字 3 位元組,約等於 333 字元。
Oracle:限制寬鬆得多。
解決方案:縮減索引欄位長度,或調整索引定義(如前綴索引)。
若初期即考慮多資料庫支援,可避免後續遷移痛苦,更能成為產品賣點。
` 反引號(可用雙引號符合 ANSI 標準)SEQUENCE + SELECT seq.nextval FROM dual 模式,改用各資料庫原生自增寫法OFFSET/LIMIT、MySQL LIMIT、Oracle 需用 ROWNUM 或 12c+ OFFSET/FETCH,建議封裝於 DAO 層設計階段即定案:全部小寫或全部大寫,並在所有 DDL、DML、應用程式 SQL 中貫徹執行。
_tablename、_id,永遠不會衝突Oracle 到 MySQL 的遷移本質是從功能豐富的商業資料庫遷移至輕量開源資料庫。掌握五大差異、落實三大設計原則,並建立自動化測試驗證流程,即可將風險降至最低。記住:相容性是設計出來的,不是改出來的。