2009-11-04 96 views
2

我对Java还是有点新,并试图将数据插入数据库。插入包含's'的字符串时出现错误,因此我的最终结果将是转义撇号。我该如何完成?用Java转义撇号

+3

“饼干的关键是撇号” - FZ – 2009-11-04 21:09:37

回答

5

StringEscapeUtils使用:

StringEscapeUtils.escapeSql(yourstring); 

注意:作为共享郎3.0:

StringEscapeUtils.escapeSql

这是一个令人误解的方法,只处理最简单的可能的SQL案例。由于SQL不是Lang的重点,所以维护这种方法没有意义。

+0

这就是我正在寻找的。 – jkushner 2009-11-04 19:18:39

+0

虽然我同意使用escapeSql可能会有负面影响,但有些地方已准备好的语句无法正常工作。例如,建立许多行的插入。话虽如此,一些数据库驱动程序将允许您将许多准备好的语句组合成批处理,然后自动将它们转换为单个更有效的语句。知道在什么时候可以进行一些研究。 – RHSeeger 2013-02-13 02:52:48

0

这取决于您使用的数据库。通常“有效”(我只对SQL Server有第一手知识)。

您使用的数据库是?

+0

我用mysql – jkushner 2009-11-04 18:31:26

2

取决于数据库,但您可以在SqlServer中使用''。

编辑:在MySQL中,你可以使用双撇号或反斜线:http://www.faqts.com/knowledge_base/view.phtml/aid/630

+0

双撇号的Postgres – 2009-11-04 18:33:18

+0

我会在评论与詹姆斯同意:使用准备好的语句。更好的长期解决方案。 – 2009-11-04 18:34:29

13

使用准备好的声明。除了处理任何特殊字符,它们更加强大并且有助于防止SQL注入攻击。

+1

+1这个答案引发了问题的核心:在方法调用中手工编写自己的SQL是一种不好的做法,并且会让您面临许多安全问题。 – rtperson 2009-11-04 18:34:27

+0

一个很好的习惯,但可能矫枉过正学习语言。 – 2009-11-04 18:34:27

+3

...只要问小鲍比表。 :) – rtperson 2009-11-04 18:35:18

6

这个问题真的不是Java而是底层数据库。最有可能的是你像这样串起你的参数:

String sql = "select * from sometable where somefield = " + someObject.getSomeField(); 

不这样做。改为使用PreparedStatement

如果这是一个需要关注这些事情的应用程序,那么它具有防止SQL注入攻击的附加优势。

+0

+1:它不仅可以帮助您避免SQL注入攻击,还可以简化在SQL语句(Date,InputStream等)中设置Java对象,并且在技术上也更高性能(在DB预编译)。 – BalusC 2009-11-04 18:54:40

1

我假设您使用的是java.sql.Statement,并使用String调用executeQuery方法。这很糟糕,因为可以执行SQL注入。您应该使用java.sql.PreparedStatement来代替,然后您可以将任何您想要的字符串设置为参数,并且您不会遇到问题。

例如:

PreparedStatement pstmt = con.prepareStatement("UPDATE MY_TABLE SET TEXT_FIELD = ?"); 
pstmt.setString(1, "any String 'will work here!");