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

[B@3a329572etc 是toString()字节数组上的 a的结果。A在 JDBC 中VARBINARY使用 a 表示。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-连接器-java
  • Java Bean,私有字符串 myVarbinary;

my_varbinary(64) 是 for SessionID/ NameOfEnglish 这样我就不需要考虑character_set和编码/解码了。

于 2016-04-16T00:29:31.007 回答