java resultset.getstring(“col_name”)查询

时间:2013-04-05 06:59:38

标签: java escaping resultset getstring

我对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之前是谁添加了这个额外的\? 对不起,如果这是一个愚蠢的问题。

2 个答案:

答案 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进行明确的去逃避。然后会发生这种情况:

  • 具有一个字符的行将从DB直接传递到屏幕。
  • 包含两个字符的行将由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的字符串。在运行时,这些转义序列不再存在。