2012-12-23 45 views
7

我在使用JdbcTemplate閱讀MySQL的VARBINARY字段時遇到問題。我們將字符串縮寫(「ABC」,「XYZ」,「LMN」等)作爲VARBINARY存儲(不要問我爲什麼)。奇怪的是,當我使用Connection類/ PreparedStatement路由,以及普通的舊的ResultSets與SqlRowSet時,讀取String時沒有問題。也就是說,JdbcTemplate:以字符串形式訪問MySQL MySQL VARBINARY字段

此代碼:

String sql = "select MY_VARBINARY_FIELD from MY_TABLE where KEY1=? and KEY2=?"; 
PreparedStatement stmt = connectionDev.prepareStatement(sql); 
prepStmt1.setInt(1, key1); 
prepStmt1.setInt(2, key2); 
ResultSet rs = stmt.executeQuery(); 

while (rs.next()) { 
    String s = rs.getString("MY_VARBINARY_FIELD"); 
    System.out.print(s + " "); 
} 

**Output:** AHI-1 DKFZp686J1653 FLJ14023 FLJ20069 JBTS3 ORF1 dJ71N10.1 

但是這個代碼不:

String sql = "select MY_VARBINARY_FIELD from MY_TABLE where KEY1=? and KEY2=?"; 
Object[] params = {key1, key2}; 
SqlRowSet rows = getJdbcTemplate().queryForRowSet(sql, params); 

while (rows.next()) { 
    String s = rows.getString("MY_VARBINARY_FIELD"); 
    System.out.print(s + " "); 
} 

**Output:** [[email protected] [[email protected] [[email protected] [[email protected] [[email protected] [[email protected] [[email protected] 

爲什麼SqlRowSet和ResultSet產生的VARBINARY不同的字符串表示?我怎樣才能使用JdbcTemplate/SqlRowSet獲得「正確」的表示?

謝謝!

SOLUTION

馬克Rotteveel(下同)回答了這個問題。我得到了它的這項工作:

String sql = "select MY_VARBINARY from MY_TABLE where KEY=VALUE"; 

SqlRowSet rows = getJdbcTemplate().queryForRowSet(sql); 

while (rows.next()) { 
    byte[] varbinary = (byte[]) rows.getObject("MY_VARBINARY"); 
    System.out.println(new String(varbinary)); 
} 

回答

6

[[email protected]等是一個字節數組上toString()的結果。使用JDBC中的byte[]表示一個VARBINARY。最有可能的,當你直接訪問它PreparedStatement,司機確實new String(getBytes(idx)),而JdbcTemplate的大概會getObject(idx).toString()代替,導致像[[email protected]輸出。

因此,要解決這個問題,做了一個JdbcTemplate的getBytes(),它自己轉換爲字符串或(更好的),直接使用字節數組列數據類型更改爲VARCHAR來代替。

+0

+1好點。此外,指定字符編碼以避免跨平臺怪異可能是一個好主意 – artbristol

+0

@artbristol確實如此,但我懷疑驅動程序也在沒有顯式字符集的情況下進行。 –

+0

+1這很有道理,你可能是對的。我今天晚些時候再查。 – ktm5124

0

如果我使用如下所示,它是好的。

  • org.mybatis 3.2.8
  • MySQL的連接器的Java 5.1.38 || mariadb-connector-java
  • Java Bean,private String myVarbinary;

my_varbinary(64)SessionID/NameOfEnglis h後,只要我不需要考慮character_set和編碼/解碼。