我在使用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));
}
+1好点。此外,指定字符编码以避免跨平台怪异可能是一个好主意 – artbristol
@artbristol确实如此,但我怀疑驱动程序也在没有显式字符集的情况下进行。 –
+1这很有道理,你可能是对的。我今天晚些时候再查。 – ktm5124