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

时间:2009-05-26 17:28:07

标签: 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.setString(2, itemdescription);
pstmt2.setString(3, itemdescription.substring(0,39));
pstmt2.executeUpdate();       

我有时会在项目描述中使用撇号和单引号和双引号。例如,我的一个项目的后期问题是“Planar 22”监视器“。当然,字符串被误解,并认为描述值只是”Planar 22“。 处理字符串中特殊字符的最佳方法是什么?

我读过有些人正在使用正则表达式,但这些似乎是根据具体情况而定的。我正在研究的另一种方法是逐个字符地读取字符串数组。我希望有一种更有效,资源更少的方式来做到这一点。

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

提前致谢

4 个答案:

答案 0 :(得分:15)

由于您正在使用PreparedStatement,因此您根本不需要执行任何操作,它将由JDBC驱动程序为您处理。您唯一需要注意的是非ASCII字符,特别是您必须确保数据库表使用文本列的编码来处理您将要使用的所有字符。但这是一个SQL问题,而不是Java问题。

答案 1 :(得分:3)

如果您将它们作为参数绑定到PreparedStatement,则不需要特别处理这些字符。这是预备陈述方法的主要好处之一。

答案 2 :(得分:3)

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

尝试使用jTDS driver,看看它是否可以帮助您使用PreparedStatement。它是SQL Server的开源数据库驱动程序。我现在在工作中使用它,它像冠军一样工作,实际上符合JDBC规范,不像MS驱动程序。

答案 3 :(得分:0)

我很确定问题与您发布的代码无关。为了帮助排除故障:

  1. 您是否尝试在调试器中运行上面的代码段?在将它传递给数据库调用之前,“itemdescription”的价值是什么?
  2. 您如何实际验证数据库中的值?这是更多的Java代码吗?或者你正在用SQLCMD或类似的东西看它?