2012-12-23 6 views
7

私はトラブルJdbcTemplateを使用して文字列としてMySQLのVARBINARYフィールドを読んを抱えているとしてMySQL VARBINARYフィールドにアクセスします。私たちは文字列略語( "ABC"、 "XYZ"、 "LMN"など)をVARBINARYとして保存しています(なぜ私に質問しません)。私がConnectionクラス/ PreparedStatementルートと普通のResultSetsとSqlRowSetを使用すると、Stringを読むのに問題はありません。つまり、あるJdbcTemplate:文字列

このコードは動作します:

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]857dc15 [[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()の結果です。 VARBINARYは、JDBCのbyte[]を使用して表されます。おそらくPreparedStatementに直接アクセスすると、ドライバはnew String(getBytes(idx))になりますが、JdbcTemplateはおそらくgetObject(idx).toString()となり、結果として[[email protected]のようになります。

だから、自分で、これを修正するJdbcTemplateにgetBytes()を行い、そしてそれを文字列に変換するために、または(より良いまだ)、直接をバイト配列を使用するか、代わりにVARCHARに列のデータ型を変更します。

+0

+1良いスポット。また、クロスプラットフォームの奇妙さを避けるために文字エンコーディングを指定することをお勧めします。 – artbristol

+0

@artbristol Trueですが、ドライバが明示的なキャラクタセットなしでもそれを実行していると思われます。 –

+0

+1これはかなり意味があり、あなたはおそらく正しいでしょう。私は今日後でチェックします。 – ktm5124

0

私はそれを以下のように使用すると良いです。

  • org.mybatis 3.2.8
  • のmysql-コネクタ-javaの5.1.38 || mariadb-connector-java
  • Java Bean、プライベート文字列myVarbinary;

my_varbinary(64)私はcharacter_setおよびエンコーディング/デコーディングを考慮する必要がないようにSessionID/NameOfEnglis時間です。

関連する問題