如何在Java中获取DB2里VARCHAR() FOR BIT DATA的String值?
解决DB2中VARCHAR FOR BIT DATA转Java String的问题
你的问题出在对OBJECT_ID的类型处理上:DB2的VARCHAR() FOR BIT DATA在JDBC中会被映射为byte数组(byte[]),而你调用getObject("OBJECT_ID").toString()得到的[B@475e586c其实是byte数组的默认字符串表示(格式是[类型标识@哈希值]),并不是二进制内容,所以用Integer.parseInt(str,2)自然会抛出NumberFormatException。
下面是两种正确的实现方式,取决于你存储的OBJECT_ID实际是什么内容:
情况1:BIT DATA存储的是字符的字节数组(比如UTF-8编码)
如果OBJECT_ID是把普通字符串按某种字符编码转成字节后存储的,直接用对应编码把byte数组转回字符串即可:
// 直接用getBytes获取byte数组,比getObject更直接 byte[] objectIdBytes = resultSet.getBytes("OBJECT_ID"); // 替换成你实际使用的字符编码,比如StandardCharsets.ISO_8859_1 String objectIdStr = new String(objectIdBytes, StandardCharsets.UTF_8);
情况2:BIT DATA存储的是二进制数据(需要转成十六进制字符串)
如果OBJECT_ID是纯粹的二进制数据(比如UUID的二进制形式、哈希值等),通常会转成十六进制字符串来表示:
方式1:自己实现转换(无第三方依赖)
byte[] objectIdBytes = resultSet.getBytes("OBJECT_ID"); StringBuilder hexBuilder = new StringBuilder(); for (byte b : objectIdBytes) { // %02x保证每个字节占两位,不足补0;用%02X可以得到大写的十六进制 hexBuilder.append(String.format("%02x", b)); } String objectIdHexStr = hexBuilder.toString();
方式2:用第三方工具类(比如Apache Commons Codec)
如果项目中已经依赖了Apache Commons Codec,可以简化代码:
import org.apache.commons.codec.binary.Hex; byte[] objectIdBytes = resultSet.getBytes("OBJECT_ID"); // 转小写十六进制 String objectIdHexStr = Hex.encodeHexString(objectIdBytes); // 转大写十六进制 // String objectIdHexStr = Hex.encodeHexString(objectIdBytes, true);
关键提醒
一定要先确认DB2中OBJECT_ID的实际存储内容:是字符编码后的字节,还是纯粹的二进制数据?选对应的转换方式才能得到正确的结果。
内容的提问来源于stack exchange,提问作者Harshvardhan Solanki
相关产品推荐
相关产品推荐

