【发布时间】:2017-12-11 20:50:00
【问题描述】:
我们有一个 Java UUID 字段,在以下转换后作为二进制字节存储在数据库 (MySQL) 中
private byte[] getUUIDtoBytes(UUID devId) {
byte[] uuidBytes = new byte[16];
ByteBuffer.wrap(uuidBytes)
.order(ByteOrder.BIG_ENDIAN)
.putLong(devId.getMostSignificantBits())
.putLong(devId.getLeastSignificantBits());
return uuidBytes;
在使用 resultSet.getBytes 从 DB 中检索它之后,字节数组通过以下方式转换回 UUID
private UUID toUUID(byte[] bytes) {
ByteBuffer byteBuffer = ByteBuffer.wrap(bytes);
Long high = byteBuffer.getLong();
Long low = byteBuffer.getLong();
return new UUID(high, low);
}
这工作正常,直到现在我必须在生产中找到一行的 UUID 字段。显示记录的应用程序可能使用 getText 或 getString 来显示字节数组,仅通过获取结果字符串的字节数组(使用 UTF-8)并应用我的 toUUID 方法,我无法取回记录的 UUID 值:(
不幸的是,我们服务的所有检索端点都需要这个 UUID 字段。我能否就如何使用该字节数组的字符串格式并将其转换回原始 UUID 提供一些提示?
【问题讨论】:
-
请突出显示进行 UUID 比较的代码,并最好评论您认为它错误的原因。
-
“显示记录的应用程序可能使用 getText 或 getString 来显示字节数组” - 输出是什么样的?你知道
byte[]->String->byte[]不是无损的吗? -
@JimmyB 但是小心……我不确定 UUID 的破折号实际上是字节数组的一部分。所以直接字符串到字节数组的转换在这里可能不起作用。
-
感谢大家的好 cmets。我想我没有很好地解释它。如上所述,我将 UUID 转换为二进制并将二进制转换回 UUID 的代码工作正常,只要它使用 ResultSet getBytes 然后使用 toUUID 转换。但是另一个应用程序(唯一一个向我们显示生产数据而不涉及操作的应用程序)正在使用 getText 或 getString 来显示二进制文件,它以“D}I´cL}»»JO'的格式显示。如何从该字符串中获取原始字节数组,然后使用我的 toUUID 将其转换回 UUID?我用 UTF-8 尝试了 String getBytes,但它不起作用
标签: java mysql database string jdbc