JDBC 驱动程序在ResultSet
. 如果真的发生了,那就太糟糕了。看这个简单的例子:
数据库表x
确实包含一列value
。有两行:一行带有两个字符串('\'
and 'n'
),另一行带有一个字符串(换行符)。我在输出中添加了一个字符串长度以进行澄清。
select *, length(value) from x;
value | length
-------+--------
\n | 2
+| 1
|
使用 JDBC 读取此表:
Connection db = DriverManager.getConnection( /* these parameters are up to you */ );
Statement st = db.createStatement();
ResultSet rs = st.executeQuery("select value, length(value) from x");
while(rs.next()){
String value = rs.getString(1);
int length = rs.getInt(2);
System.out.println("length="+length+", value='"+value+"'");
}
您会看到:到目前为止,代码中的任何地方都没有显式转义。输出是:
length=2, value='\n'
length=1, value='
'
你看:仍然没有任何东西被转义——代码和 JDBC 都没有。
但
如果你混合使用 Java 文字,事情会变得有点模糊:如果你做这样的事情:
st.execute("insert into x values ('\n')");
然后猜猜发生了什么?您还有一个字符的另一行!
length=2, value='\n'
length=1, value='
'
length=1, value='
'
这是因为 Java编译器将两个字符 '\n' 翻译成一个换行符。因此 JDBC 驱动程序和数据库只能看到一个字符。
但是,如果您已经阅读了一些用户输入并且用户已经键入\
,n
那么没有人会对此进行转义,并且该行将包含两个字符。
下一步
您说,您使用StringEscapeUtils
. 然后会发生这种情况:
- 带有一个字符的行将从数据库中原封不动地传递到屏幕上。
- 包含两个字符的行将被更改
StringEscapeUtils
为包含一个字符的字符串。在那之后,这两行对你来说看起来都一样。
概括
不要将编译器的字符串文字转义与 JDBC 的转义混淆(这不会发生)。
不要添加不必要的转义层。