SQL语法错误求助:执行INSERT语句时遭遇"\',\'"异常
解决SQL语法错误:java.sql.SQLSyntaxErrorException
从你的控制台输出和代码来看,生成的SQL语句存在单引号不匹配的问题,直接触发了语法错误。先看一下你的输出和代码:
控制台输出
[10, name, N, 11-11, Address, 12, City, XX, 123-123-123, 321-321-321, maaaail] INSERT INTO CUSTOMER (CUSTOMER_ID, NAME, ZIP, ADDRESSLINE1, ADDRESSLINE2, CITY, STATE, PHONE, FAX, EMAIL) VALUES (10','name','11-11','Address','12','City','XX','123-123-123','321-321-321','maaaail) java.sql.SQLSyntaxErrorException: Syntax error: Encountered "\',\'" at line 1, column 117.
你的代码
System.out.println(Arrays.toString(dane)); sql = "INSERT INTO CUSTOMER (CUSTOMER_ID, NAME, ZIP, ADDRESSLINE1, ADDRESSLINE2, CITY, STATE, PHONE, FAX, " + "EMAIL) VALUES (" + dane[0] + "','" + dane[1] + "','" + dane[3] + "','" + dane[4] + "','" + dane[5] + "','" + dane[6] + "','" + dane[7] + "','" + dane[8] + "','" + dane[9] + "','" + dane[10] + ")"; System.out.println(sql);
错误原因分析
仔细看生成的SQL语句,VALUES子句的开头是(10','name'... —— 第一个值10前面缺少单引号,但后面却多了一个单引号,导致SQL解析器遇到了'','这种非法的语法组合,直接抛出了语法错误。
另外,最后一个值maaaail后面也缺少闭合的单引号,这也是触发语法问题的原因之一。
解决方法
1. 临时修复:修正字符串拼接的单引号
调整SQL拼接的VALUES部分,给第一个参数加上开头的单引号,同时给最后一个参数补上闭合的单引号:
sql = "INSERT INTO CUSTOMER (CUSTOMER_ID, NAME, ZIP, ADDRESSLINE1, ADDRESSLINE2, CITY, STATE, PHONE, FAX, " + "EMAIL) VALUES ('" + dane[0] + "','" + dane[1] + "','" + dane[3] + "','" + dane[4] + "','" + dane[5] + "','" + dane[6] + "','" + dane[7] + "','" + dane[8] + "','" + dane[9] + "','" + dane[10] + "')";
这样生成的SQL会变成('10','name','11-11',...,'maaaail'),单引号完全匹配,语法错误就会消失。
2. 推荐方案:使用PreparedStatement(更安全可靠)
直接拼接字符串不仅容易出现这类单引号错误,还会带来SQL注入的安全风险。强烈推荐使用PreparedStatement来参数化查询:
// 预编译SQL,用?作为参数占位符 String sql = "INSERT INTO CUSTOMER (CUSTOMER_ID, NAME, ZIP, ADDRESSLINE1, ADDRESSLINE2, CITY, STATE, PHONE, FAX, EMAIL) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; PreparedStatement pstmt = connection.prepareStatement(sql); // 给每个占位符设置参数(索引从1开始) pstmt.setString(1, dane[0]); pstmt.setString(2, dane[1]); pstmt.setString(3, dane[3]); pstmt.setString(4, dane[4]); pstmt.setString(5, dane[5]); pstmt.setString(6, dane[6]); pstmt.setString(7, dane[7]); pstmt.setString(8, dane[8]); pstmt.setString(9, dane[9]); pstmt.setString(10, dane[10]); // 执行插入操作 pstmt.executeUpdate();
这种方式不需要手动处理单引号,数据库驱动会自动帮你处理参数的转义和格式,既彻底避免了语法错误,又大幅提升了应用的安全性。
内容的提问来源于stack exchange,提问作者Sheio




