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

Java 如何从用户输入中转义撇号,java,sql,jdbc,escaping,Java,Sql,Jdbc,Escaping,因此,我正在将.csv文件中的信息导入数据库。然而,我对csv文件中用户输入的描述有问题,因为它们包含撇号,这破坏了SQL导入 我的导入语句是字符串sqlJob= "INSERT INTO job (ID, Job_Contact, Internal_Comment, Customer_Name," + " Duration, Job_Location, Job_Completion_Date, Job_Technician," + " Job_Asset, Job_Type, Jo

因此,我正在将.csv文件中的信息导入数据库。然而,我对csv文件中用户输入的描述有问题,因为它们包含撇号,这破坏了SQL导入

我的导入语句是字符串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)+"');";
简化的表格将是

"INSERT INTO job (ID, Description) VALUES ('"
  + csvRecord.get(i) + "', '" + csvRecord.get(34) + "');";
问题是
csvRecord.get(34)
有时会包含撇号。例如,“我的名字是Bob”,Bob中的撇号打破了周围的撇号,这些撇号是声明值是SQL的字符串所必需的

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


谢谢

问题在于,您正在将SQL语句组装为字符串,并将参数值连接在一起。这是极不可取的

使用易于使用的
PreparedStatement
s。您可以不经任何修改就传递参数,并且它们不会干扰SQL语句的正确执行

另外,作为一项有价值的奖励,您的代码将不会出现SQL注入问题

示例来自:

如您所见,参数没有连接到字符串中,但它们将取代
符号


即使
coffeeName
具有值
“非洲最好的”
(包括撇号),查询也会运行良好。

使用PreparedStatement,这样您就可以保存了

 String name = request.getParameter( "ID" );
        String message = request.getParameter( "Job_Contact" );

        Connection c = null;
        try
        {
            String url = "jdbc:mysql://localhost/**"databasename"**;
            String username = "**<Database Login>**";
            String password = "**<Database password>**";

            **// at the ? section you can add any quantity you need to**

            String sql = "insert into **<databasename>**(name, message) values (?, ?)";

            c = DriverManager.getConnection( url, username, password );
            PreparedStatement pstmt = c.prepareStatement( sql );
            pstmt.setString( 1, name );
            pstmt.setString( 2, message );
            pstmt.executeUpdate();
        }
        catch( SQLException e )
        {
            throw new ServletException( e );
        }
        finally
        {
            try
            {
                if( c != null ) c.close();
            }
            catch( SQLException e )
            {
                throw new ServletException( e );
            }
        }
String name=request.getParameter(“ID”);
String message=request.getParameter(“Job_Contact”);
连接c=null;
尝试
{
String url=“jdbc:mysql://localhost/**“数据库名称”**;
字符串username=“****”;
字符串密码=“****”;
**//在?部分,您可以添加需要添加的任何数量**
字符串sql=“插入****(名称、消息)值(?,)”;
c=DriverManager.getConnection(url、用户名、密码);
PreparedStatement pstmt=c.prepareStatement(sql);
pstmt.setString(1,名称);
pstmt.setString(2,消息);
pstmt.executeUpdate();
}
捕获(SQLE异常)
{
抛出新的ServletException(e);
}
最后
{
尝试
{
如果(c!=null)c.close();
}
捕获(SQLE异常)
{
抛出新的ServletException(e);
}
}

使用参数化查询而不是串接字符串。@程序员的回答提到了这一点和解决方案,但“SQL注入”“是您在尝试使用自己的角色转义代码时面临的主要问题。如果您使用可以为您管理参数的库,则会更安全,最终也更容易。好的,非常感谢!我不太清楚准备好的声明的目的,但这很有道理。
 String name = request.getParameter( "ID" );
        String message = request.getParameter( "Job_Contact" );

        Connection c = null;
        try
        {
            String url = "jdbc:mysql://localhost/**"databasename"**;
            String username = "**<Database Login>**";
            String password = "**<Database password>**";

            **// at the ? section you can add any quantity you need to**

            String sql = "insert into **<databasename>**(name, message) values (?, ?)";

            c = DriverManager.getConnection( url, username, password );
            PreparedStatement pstmt = c.prepareStatement( sql );
            pstmt.setString( 1, name );
            pstmt.setString( 2, message );
            pstmt.executeUpdate();
        }
        catch( SQLException e )
        {
            throw new ServletException( e );
        }
        finally
        {
            try
            {
                if( c != null ) c.close();
            }
            catch( SQLException e )
            {
                throw new ServletException( e );
            }
        }