JdbcTemplate: Zugriff auf MySQL VARBINARY-Feld als String
Ich habe Probleme beim Lesen von MySQL ist VARBINARY Feld als String mit JdbcTemplate. Wir sind keine string-Abkürzungen ("ABC", "XYZ", "LMN" und dergleichen) als VARBINARYs (fragt mich nicht warum). Komischerweise, wenn ich die Connection-Klasse /PreparedStatement-route, und das gute alte ResultSets vs. SqlRowSet, ich habe kein problem, Lesen der Zeichenfolge. Das heißt,
Dieser code funktioniert:
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
Aber dieser code nicht:
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
Warum SqlRowSet und ResultSet erzeugen eine unterschiedliche String-Repräsentation für die VARBINARY? Und wie bekomme ich die "richtige" Darstellung mit JdbcTemplate/SqlRowSet?
Dank!
LÖSUNG
Mark Rotteveel (unten) die Frage beantwortet. Ich habe es mit dieser zu arbeiten:
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));
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
[B@3a329572
etc ist das Ergebnis einertoString()
auf ein byte-array. EinVARBINARY
vertreten ist, mit einembyte[]
in JDBC. Wahrscheinlich, wenn Sie direkt auf ihn zugreifen aufPreparedStatement
, der Fahrer mussnew String(getBytes(idx))
, während die JdbcTemplate wahrscheinlich noch eingetObject(idx).toString()
statt, was eine Ausgabe wie[B@3a329572
.So, um dies zu beheben, führen Sie eine
getBytes()
auf dem JdbcTemplate, und konvertieren Sie es in den string selbst oder (noch besser), verwenden Sie das byte-array direkt oder ändern Sie die Spalte Datentyp auf VARCHAR statt.Wenn ich das wie unten, ist es gut.
my_varbinary(64)
ist fürSessionID
/NameOfEnglis
h, so dass ich nicht brauchen, um Bedenkencharacter_set
- und encoding/decoding.