我对java for JDBC中的ResultSet.getString()
方法有一个简单的查询
假设数据库列中的值具有\
,这是javas转义字符,例如\n
或\t
等
当我将值检索为getString()
时,我看到另外一个转义字符被添加,此\n
的实际含义现在只是字符串文字。
所以我不得不unescape java然后正确使用它。
String s= rs.getString("col_name");
当s
包含`\ n'时:
System.out.println(s)
输出:
\n
使用apache common StringEscapeUtils
解除java后的问题
输出:
System.out.println("hi"+s+"hello");
hi
hello
我的问题是在unescaping之前是谁添加了这个额外的\
?
对不起,如果这是一个愚蠢的问题。
答案 0 :(得分:2)
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。
<强> BUT 强>
如果你混合使用Java文字,事情就会变得有点模糊:如果你这样做:
st.execute("insert into x values ('\n')");
然后猜猜发生了什么?你有另一行一个字符!
length=2, value='\n'
length=1, value='
'
length=1, value='
'
这是因为Java 编译器将两个字符'\ n'翻译成一个换行符。因此JDBC驱动程序和数据库只能看到一个字符。
但是如果您已经阅读了一些用户输入并且用户输入了\
和n
,则没有人会撤消此操作,并且该行将包含两个字符。
下一步
你说,你使用StringEscapeUtils
进行明确的去逃避。然后会发生这种情况:
StringEscapeUtils
更改为包含一个字符的字符串。在那之后,两行对你来说都是一样的。<强>摘要强>
不要将编译器的String-Literal转义与JDBC的转义混淆(这不会发生)。
不要添加不必要的转义图层。
答案 1 :(得分:1)
getString()
没有逃避任何事情。
如果您有一个EOL字符(在Java String literal 中写为"\n"
,但在字符串中是单个字符,其数值为10)在存储的字符串中数据库,然后getString()
将返回包含此字符的String。打印此字符串将产生两行。
如果你有一个\
字符后跟一个n
字符(因此在Java字符串文字中写成"\\n"
,但只会在字符串中产生两个字符,\
和n
),然后getString()
将返回包含这两个字符的字符串。打印此字符串将导致打印\n
。
简而言之,\n
用于在Java源代码中的字符串文字中添加换行符。但是这由编译器转换为只包含一个换行符的String。不是包含反斜杠后跟n
的字符串。在运行时,这些转义序列不再存在。