首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MySQL PreparedStatement 佔位符報語法錯誤:SQL 拼接導致 ? 被當字面量

     編輯:程式設計綜合問答

錯誤代碼


String sql = "SELECT * FROM user WHERE name=? AND sex=?"; // 正確
// 但實際執行時打印發現:
// SELECT * FROM user WHERE name=? AND sex=?  ← 沒問題
// 若報錯 near '? and sex=?',說明 SQL 字符串本身有問題

排查步驟

  1. 執行前打印 SQL:System.out.println(sql); 確認無拼接、無多餘引號。
  2. 直接在數據庫客戶端跑打印出的 SQL(替換 ? 為實值)驗證語法。
  3. 檢查表名、列名是否為保留字(需反引號)。
  4. 確認 pstat.executeQuery() 無參重載:
    rs = pstat.executeQuery(); // 不傳 sql 參數
    傳參版 executeQuery(String sql) 是 Statement 的,PreparedStatement 不能再傳 SQL,否則會把 ? 當字面量執行。

正確調用鏈


String sql = "SELECT * FROM user WHERE name=? AND sex=?";
try (PreparedStatement ps = conn.prepareStatement(sql)) {
    ps.setString(1, name);
    ps.setString(2, sex);
    try (ResultSet rs = ps.executeQuery()) { // 無參
        ...
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved