7

JdbcTemplateを使用してMySQLのVARBINARYフィールドを文字列として読み取るのに問題があります。文字列の略語(「ABC」、「XYZ」、「LMN」など)をVARBINARYとして保存しています(理由は聞かないでください)。不思議なことに、Connectionクラス/ PreparedStatementルートを使用し、単純な古いResultSetsとSqlRowSetを使用すると、文字列の読み取りに問題はありません。つまり、

このコードは機能します:

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:** [B@3a329572 [B@4ef18d37 [B@546e3e5e [B@11c0b8a0 [B@399197b [B@3857dc15 [B@10320399 

SqlRowSetとResultSetがVARBINARYに対して異なる文字列表現を生成するのはなぜですか?また、JdbcTemplate / SqlRowSetを使用して「正しい」表現を取得するにはどうすればよいですか?

ありがとう!

解決

Mark 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));
}
4

2 に答える 2

7

などは、バイト配列のaの[B@3a329572結果です。toString()Aは、JDBCでVARBINARYを使用して表されます。byte[]ほとんどの場合、に直接アクセスするとPreparedStatement、ドライバーはにアクセスしますnew String(getBytes(idx))が、JdbcTemplateはおそらくgetObject(idx).toString()代わりにアクセスし、のような出力になります[B@3a329572

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

于 2012-12-24T10:43:57.800 に答える
0

以下のように使えばいいです。

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

my_varbinary(64)SessionID/ h 用なので、エンコード/デコードNameOfEnglisを考慮する必要はありません。character_set

于 2016-04-16T00:29:31.007 に答える