2013-04-05 65 views
3

我有一個簡單的查詢關於在JDBC for JDBC中的ResultSet.getString()方法。
假設數據庫列中的值有\這是javas轉義字符,例如\n\t
當我檢索到的值爲getString()我看到一個更多的轉義字符越來越多,這個\n的實際含義現在只是一個字符串文字。
所以我不得不unescape java,然後正確使用它。java resultset.getstring(「col_name」)查詢

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

s包含'\ n'的

System.out.println(s) 

輸出:

\n 

使用共同的apache的java反向轉義後StringEscapeUtils
輸出:

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

我的問題是誰正在加入這個額外的\在回顧之前? 對不起,如果這是一個愚蠢的問題。

+1

看起來JDBC正在逃避所有特殊的功能,以確保文本以存儲在數據庫中的方式顯示。因此,如果你在數據庫中有* hello \ nworld *,當它被提取時它將變成'hello \\ nworld'。看起來應該是這樣。 – svz 2013-04-05 07:05:21

+0

@svz JDBC不會在「ResultSet」中轉義任何內容。 __那是它應該的方式。否則,很多應用程序都會遇到問題,無法知道數據庫中的真實內容以及某些任意層發生了什麼變化。 – 2013-04-05 09:34:48

回答

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。

事情得到,如果你在Java中的文字混合有點陰沉:如果你做這樣的事情:

st.execute("insert into x values ('\n')"); 

然後猜發生了什麼?你有另一排一個字符!

length=2, value='\n' 
length=1, value=' 
' 
length=1, value=' 
' 

這是因爲Java編譯器翻譯兩個字符「\ n」成一個換行符。因此,JDBC驅動程序和數據庫只能看到一個字符。

但是,如果你會看到一些userinput和用戶將鍵入\n然後沒有人會避免這種情況,該行將包含兩個字符。

下一步

你說,你做明確的使用StringEscapeUtils去逃避。然後這會發生:

  • 有一個字符的行將從數據庫一直傳遞到屏幕。
  • 具有兩個字符的行將被StringEscapeUtils更改爲包含一個字符的字符串。之後,這兩行對你來說看起來都一樣。

摘要

不要混淆字符串文本逃逸編譯器與JDBC轉義(不會發生)。

請勿添加不必要的轉義層。

+0

unescaping是必需的,因爲對於我的情況,我希望它充當** \ n **而不是文字。 – Anubhab 2013-04-05 10:41:08

+1

@Anubhab可能是這樣,但它與這個問題有關嗎?問題是關於JDBC。如果你的_display logic_行爲與你的_edit logic_行爲不同,那麼它不在Q. – 2013-04-05 11:01:17

+0

的範圍內..我的最後一個問題是,如果Resultset已經返回'\\'和'n'那麼爲什麼Syso會將它打印爲'\ n '爲什麼不能像換行符? – Anubhab 2013-04-05 11:07:13

1

getString()不能逃脫任何東西。

如果你有一個EOL字符(在Java字符串字面寫爲"\n",但作爲字符串中的一個字符,其數值爲10)存儲在數據庫中的字符串,然後getString()將返回包含此字符的字符串。打印此字符串將導致兩行。

如果你有\字符後跟一個n字符(因而被寫爲Java String文字"\\n",但只會導致串,\n在兩個字符),然後getString()將返回包含這兩個字符的字符串。打印此字符串將導致打印\n

簡而言之,\n用於在Java源代碼中的字符串文字中添加換行符。但是,編譯器會將其轉換爲僅包含一個換行符的字符串。不是包含反斜槓的字符串,後跟n。在運行時,這些轉義序列不再存在。

+0

固定。 StackOverflow似乎將雙反斜槓轉換爲單一反斜槓。 – 2013-04-05 07:44:04

+0

我明白了你的意思,但是我的問題是誰加入額外的'\\'然後? – Anubhab 2013-04-05 07:58:07

+0

你的代碼可能是這樣做的。 – 2013-04-05 07:58:38