【问题标题】:how to get back the java UUID stored in DB as binary如何以二进制形式取回存储在 DB 中的 java UUID
【发布时间】: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


【解决方案1】:

我认为您可以通过 UUID#fromString() 方法将您的 UUID 字符串转换为真正的 UUID 对象。然后,您可以比较您拥有的两个 UUID 的最低和最高有效位字段:

boolean UUIDIsEqual(UUID one, String twoInput) {
    UUID two = UUID.fromString(twoInput);
    if (one.getLeastSignificantBits() == two.getLeastSignificantBits() &&
        one.getMostSignificantBits() == two.getMostSignificantBits()) {
        return true;
    }

    return false;
}

如果您有一个字节数组而不是 UUID 作为引用,那么您可以使用 toUUID() 方法,您已经必须将字符串转换为 UUID。

按照下面的链接查看演示,该演示显示字符串到 UUID 的转换有效并且在逻辑上是正确的:

Demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-01
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多