使用PreparedStatement向MySQL插入数据时遭遇SQL语法错误求助
解决PreparedStatement插入时的MySQL语法错误问题
你遇到的问题核心在于SQL语句里的字段名没有正确转义,从错误提示能明显看出来问题所在:
错误信息里的字段列表1, 2, 3, 4, 5, 6, 7, 8, 9, guess, answer, value触发了语法报错,原因有两个:
- 数字开头的字段名(比如
1、2...9)在MySQL里不能直接使用,必须用反引号(`)包裹才能被识别为字段标识符; value是MySQL的保留关键字,直接作为字段名会被数据库当成SQL语法的一部分,同样需要用反引号转义。
修正方案
把所有字段名用反引号包裹,同时坚持使用PreparedStatement的参数占位符?(不要直接拼接参数值,这也是PreparedStatement的正确用法,还能防SQL注入),正确的SQL语句应该是这样:
INSERT INTO 你的表名 (`1`, `2`, `3`, `4`, `5`, `6`, `7`, `8`, `9`, `guess`, `answer`, `value`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
示例代码片段
假设你的表名为game_records,对应的Java代码可以参考这个写法:
String insertSql = "INSERT INTO game_records (`1`, `2`, `3`, `4`, `5`, `6`, `7`, `8`, `9`, `guess`, `answer`, `value`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; try (PreparedStatement pstmt = conn.prepareStatement(insertSql)) { // 按占位符顺序依次设置参数 pstmt.setInt(1, 17); pstmt.setInt(2, 187); pstmt.setInt(3, 224); pstmt.setInt(4, 276); pstmt.setInt(5, 19); // ... 继续设置剩下的参数 pstmt.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); }
另外建议尽量避免用数字开头的名称或MySQL保留关键字作为字段名,这样能从根源上减少这类语法问题。
内容的提问来源于stack exchange,提问作者blah
相关产品推荐
相关产品推荐

