java resultset.getstring(“col_name”)查询

我有一个关于java for JDBC中ResultSet.getString()方法的简单查询。
假设Database列中的值具有\ ,这是javas转义字符,例如\n\t等。
当我将值检索为getString()我看到另外一个转义字符被添加,这个\n的实际含义现在只是一个字符串文字。
所以我不得不unescape java然后正确使用它。

 String s= rs.getString("col_name"); 

s包含`\ n’时:

 System.out.println(s) 

输出:

 \n 

在使用apache常见的StringEscapeUtils
输出:

 System.out.println("hi"+s+"hello"); hi hello 

我的问题是在unescaping之前是谁添加了这个额外的\ ? 对不起,如果这是一个愚蠢的问题。

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驱动程序和数据库只能看到一个字符。

但是,如果您已经阅读了一些用户输入,并且用户将输入\n则没有人会撤消此操作,并且该行将包含两个字符。

下一步

你说,你使用StringEscapeUtils进行显式的StringEscapeUtils 。 然后会发生这种情况:

  • 具有一个字符的行将从DB直接传递到屏幕。
  • 具有两个字符的行将被StringEscapeUtils更改为包含一个字符的字符串。 在那之后,两行对你来说都是一样的。

概要

不要将编译器的String-Literal转义与JDBC的转义混淆(这不会发生)。

不要添加不必要的转义层。

getString()不会转义任何东西。

如果在数据库中存储的字符串中有EOL字符(在Java字符串文字中写为"\n" ,但字符串中的单个字符,其数值为10),则getString()将返回一个字符串包含这个角色。 打印此字符串将产生两行。

如果你有一个\字符后跟一个n字符(因此在Java字符串文字中写为"\\n" ,但只会在字符串中产生两个字符, \n ),那么getString()将返回包含这两个字符的String。 打印此字符串将导致\n打印。

简而言之, \n用于在Java源代码中的字符串文字中添加换行符。 但是这由编译器转换为只包含一个换行符的String。 不是包含反斜杠后跟n的String。 在运行时,这些转义序列不再存在。

Interesting Posts