在 postgresql 13 中按 myColumn::UUID 或按 myColumn::text 排序會產生完全相同的排序。(uuid_v4)
在 Java 中,它不會:
List<UUID> uuids =
Stream.of(UUID.randomUUID(), UUID.randomUUID())
.sorted()
.collect(Collectors.toList());
UUID uuid1 = uuids.get(0);
UUID uuid2 = uuids.get(1);
Assert.assertEquals(
Math.signum((int) uuid1.compareTo(uuid2)),
Math.signum((int) uuid1.toString().compareTo(uuid2.toString()))); // postgresql orders like this
java.lang.AssertionError:
Expected :-1
Actual :1
我對 Java 排序 UUID 背后的原因很感興趣,這種方式與它們的字串表示的順序和資料庫完全不一致。
感覺就像 UUID.toString() 以錯誤的方式使用最低和最高有效位(?)它在表示的開頭使用最低有效位而不是最高有效位。
- PostgreSQL 13.4
- Java 11.0.5
uj5u.com熱心網友回復:
好吧,在一種情況下,您比較 UUID,在另一種情況下,按詞法順序比較兩個字串。
根據 Javadoc:
如果第一個 UUID 的 UUID 不同的最重要欄位大于第二個 UUID,則兩個 UUID 中的第一個大于第二個。
uj5u.com熱心網友回復:
這是因為 Java 沒有 unsigned 型別,并且通過比較兩對有符號的longs來比較 UUID 。這令人沮喪。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/345303.html
上一篇:命令列倒數計時器跳過一秒
下一篇:盡管回傳條件為真,函式也不會回傳
