You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动