小编典典
JDBC驱动程序不会在中转义ResultSet。如果这样做的话将是非常糟糕的。看这个简单的例子:
数据库表x确实包含一列value。有两行:一行有两个字符串('\'和'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驱动程序和数据库只能看到一个字符。
但是,如果您将阅读一些userinput并且用户将进行键入\,n然后没有人会转义此行,则该行将包含两个字符。
下一步
您说,您使用进行了明确的转义StringEscapeUtils。然后会发生这种情况:
具有一个字符的行将不更改地从DB传递到屏幕。
具有两个字符的行将变为StringEscapeUtils包含一个字符的字符串。之后,这两行对您来说都一样。
摘要
不要将编译器的String-Literal转义与JDBC的转义混淆(这不会发生)。
不要添加不必要的转义层。
2020-11-19