如何处理Java PrepareStatement中的特殊字符?

如何处理Java PrepareStatement中的特殊字符?,java,string,special-characters,Java,String,Special Characters,在以下使用PreparedStatement类的SQL查询中: String query_descrip = "insert into timitemdescription (itemkey, languageid, longdesc, shortdesc) values (?, 1033, ?,?)"; PreparedStatement pstmt2 = con.prepareStatement(query_descrip); pstmt2.setInt(1, rs4); pstmt2.s

在以下使用
PreparedStatement
类的SQL查询中:

String query_descrip = "insert into timitemdescription (itemkey, languageid, longdesc, shortdesc) values (?, 1033, ?,?)";
PreparedStatement pstmt2 = con.prepareStatement(query_descrip); 
pstmt2.setInt(1, rs4);
pstmt2.setString(2, itemdescription);
pstmt2.setString(3, itemdescription.substring(0,39));
pstmt2.executeUpdate();       
我有时会在我的物品描述中看到撇号和单引号和双引号。例如,我最近发布的一个项目是“平面22”监视器。当然,字符串被误解,认为描述值只是“平面22”。 处理字符串中特殊字符的最佳方法是什么

我已经读到一些人在使用正则表达式,但是这些似乎是针对具体情况的。我正在研究的另一种方法是逐字符读取字符串数组。我希望有一种更高效、资源消耗更少的方法来实现这一点

升级 经过更广泛的测试,我的代码中出现了更多的问题。这也是一个URL编码问题。当html表单由jsp代码填充时,它会尝试将描述字段移动到在线表单,它会在表单上而不是在查询上截断它。jTDS还纠正了接收到的问题特殊字符。因为jTDS是一个jar,它也有助于避免重新启动机器。我将奖励jTDS线程,因为这是我部分使用的


提前感谢

因为您使用的是PreparedStatement,所以您不必做任何事情,它将由JDBC驱动程序为您处理。您唯一需要注意的是非ASCII字符,特别是您必须确保DB表对文本列使用编码,可以处理您将要访问的所有字符但是这是一个SQL问题,而不是Java问题。

如果要像现在这样将这些字符作为参数绑定到PreparedStatement,则不需要特别处理这些字符。这是PreparedStatement方法的主要好处之一。

就像其他人所说的,您不必做任何事情来处理这些特殊字符。您需要尝试不同的JDBC驱动程序


尝试使用,看看它是否对您的PreparedStatement有帮助。它是SQL Server的开放源代码数据库驱动程序。我现在在工作中使用它,它工作起来像champ,实际上与MS驱动程序不同,它符合JDBC规范。

我相当肯定问题不在于您发布的代码。要帮助排除故障,请执行以下操作:

  • 您是否尝试过在调试器中运行上面的代码段?在将其传递到数据库调用之前,“itemdescription”的值是多少
  • 您实际上是如何验证数据库中的值的?这是更多的Java代码吗?还是您正在使用SQLCMD或类似的工具查看它

  • 您使用的是什么JDBC驱动程序和数据库?我使用的是MS SQL Server 2000驱动程序,用于JDBC和SQL Server 2005。为什么我的问题被否决了?当我将itemdescription传递到准备好的语句中时,带双引号的字符串不会被转义并解释为值终止符。您知道有什么解决方法吗?什么SQL Server and您使用的驱动程序是什么?如果它确实没有正确地转义字符串,那么它是有严重缺陷的(可能在其他方面也有)我会考虑移到另一个。我用JSQBServer 2000驱动程序来驱动JDBC和SQLServer 2005。JDBC驱动程序有一个更新近的版本吗?不逃避引用是一个绝对的显示阻止错误,使驱动程序完全没有价值。我简直不敢相信微软会发布这样一个明显损坏的版本。这是您的代码的一个问题,虽然上面的示例看起来不错,但我不知道有什么方法可以误用PreparedStatements,从而导致这样的问题。让我有点怀疑的是,被解释为值终止符的中间字符串在无法解析其余值时会导致SQLException。是否会发生这种情况?如果有,我会s、 我将无法重新加载更新版本的驱动程序,因为其他程序正在使用它。它也在无法重新启动的服务器上运行。您能为准备好的语句提供任何实现jar文件的示例代码或链接吗?您现在的代码示例可以工作。唯一不同的是用于创建连接的驱动程序url。当我尝试运行Class.forName(“net.sourceforge.jtds.jdbc.driver”);在try..catch子句中,它不断告诉我“必须捕获或抛出”有什么想法吗?不管怎样,当我只是从sqlexception更改异常时,它似乎正在工作