如何从用户输入中转义撇号

Ton*_*nse 2 java sql escaping jdbc

所以我将.csv文件中的信息导入数据库.但是我在csv文件中输入用户输入的描述时遇到问题,因为它们包含撇号,这会打破SQL导入.

我的Import语句是String sqlJob =

"INSERT INTO job (ID, Job_Contact, Internal_Comment, Customer_Name," 
  + " Duration, Job_Location, Job_Completion_Date, Job_Technician," 
  + " Job_Asset, Job_Type, Job_Description) VALUES ('"
  +csvRecord.get(i)+"', '"+csvRecord.get(26)+"', '"+csvRecord.get(16)
  +"', '"+csvRecord.get(2)+"', '"+csvRecord.get(31)+"', '"+csvRecord.get(27)
  +"', '"+csvRecord.get(28)+"', '"+csvRecord.get(29)+"', '"+csvRecord.get(30)
  +"', '"+csvRecord.get(33)+"', '"+csvRecord.get(34)+"');";
Run Code Online (Sandbox Code Playgroud)

简化形式将是

"INSERT INTO job (ID, Description) VALUES ('"
  + csvRecord.get(i) + "', '" + csvRecord.get(34) + "');";
Run Code Online (Sandbox Code Playgroud)

问题csvRecord.get(34)有时会包含撇号.例如,"My name's Bob"和Bob中的撇号打破了声明该值是SQL字符串所需的周围撇号.

是否有一种简单的方法来解析字符串并在撇号前面添加转义字符,或者我应该以不同的方式格式化原始SQL命令.

谢谢!

The*_*ler 8

问题是您将SQL语句组装为String,连接参数值.这是非常不可取的.

使用PreparedStatements代替更容易使用.您可以在不进行任何修改的情况下传递参数,并且不会干扰SQL语句的正确执行.

此外,作为一个有价值的奖金,您的代码将没有SQL注入问题.

从实施例JDBC教程:

String updateString = "update COFFEES set SALES = ? where COF_NAME = ?";
PreparedStatement updateSales = con.prepareStatement(updateString);
updateSales.setInt(1, numSales);
updateSales.setString(2, coffeeName);
updateSales.executeUpdate();
Run Code Online (Sandbox Code Playgroud)

如您所见,参数不会连接到String中,但它们将取代?符号.

即使coffeeName具有值"Africa's Best"(包括撇号),查询也能正常工作.