MyBatis 執行 Oracle SQL 時拋出 ORA-00911: invalid character,但在 PL/SQL Developer 中執行完全正常。根因極簡單:MyBatis/JDBC 不允許 SQL 結尾分號。
錯誤現象

- Mapper XML 或註解中 SQL 字串以
; 結尾
- Navicat 匯出 SQL 帶分號直接貼上
- PL/SQL、SQL*Plus 等工具習慣加分號
解決方案
- 移除 SQL 字串尾部分號
- Mapper XML 範例:
- 註解式映射同理:
@Select("SELECT * FROM users WHERE id = #{id}") // 無分號
User findById(@Param("id") Long id);
深度解析
- JDBC 驅動程式將 SQL 直接送給資料庫引擎解析
- Oracle 伺服器端解析器不接受分號作為陳述式結束符(工具端負責分割多條 SQL)
- 分號屬於「無效字元」導致 ORA-00911
預防清單
- Mapper XML/註解 SQL 絕不加分號
- 從工具複製 SQL 時務必手動移除結尾分號
- 多條 SQL 需拆分為多個 Mapper 方法或使用批次處理 API
- 單元測試覆蓋所有 Mapper 方法,CI 階段攔截此類低級錯誤
一個分號,浪費半天排查時間——養成「無分號」肌肉記憶最划算。