虽然这并不是一个明确的答案 - 即“PostgreSQL所有安装中是否定义了该行为?”,但此SQL(适用于SQL Server)可检查GUID中每个字节的排序。可能需要一些调整才能在PostgreSQL中使用。
生成这样的映射应该可以让人们看到特定UUID结构(其中之一是明确定义的类型或其他类型)在PostgreSQL中“以特定方式排序”的情况。
With UIDs As (-- 0 1 2 3 4 5 6 7 8 9 A B C D E F
Select ID = 'F', UID = cast ('00000000-0000-0000-0000-000000000011' as uniqueidentifier)
Union Select ID = 'E', UID = cast ('00000000-0000-0000-0000-000000001100' as uniqueidentifier)
Union Select ID = 'D', UID = cast ('00000000-0000-0000-0000-000000110000' as uniqueidentifier)
Union Select ID = 'C', UID = cast ('00000000-0000-0000-0000-000011000000' as uniqueidentifier)
Union Select ID = 'B', UID = cast ('00000000-0000-0000-0000-001100000000' as uniqueidentifier)
Union Select ID = 'A', UID = cast ('00000000-0000-0000-0000-110000000000' as uniqueidentifier)
Union Select ID = '9', UID = cast ('00000000-0000-0000-0011-000000000000' as uniqueidentifier)
Union Select ID = '8', UID = cast ('00000000-0000-0000-1100-000000000000' as uniqueidentifier)
Union Select ID = '7', UID = cast ('00000000-0000-0011-0000-000000000000' as uniqueidentifier)
Union Select ID = '6', UID = cast ('00000000-0000-1100-0000-000000000000' as uniqueidentifier)
Union Select ID = '5', UID = cast ('00000000-0011-0000-0000-000000000000' as uniqueidentifier)
Union Select ID = '4', UID = cast ('00000000-1100-0000-0000-000000000000' as uniqueidentifier)
Union Select ID = '3', UID = cast ('00000011-0000-0000-0000-000000000000' as uniqueidentifier)
Union Select ID = '2', UID = cast ('00001100-0000-0000-0000-000000000000' as uniqueidentifier)
Union Select ID = '1', UID = cast ('00110000-0000-0000-0000-000000000000' as uniqueidentifier)
Union Select ID = '0', UID = cast ('11000000-0000-0000-0000-000000000000' as uniqueidentifier)
)
Select * From UIDs Order By UID desc
在 SQL Server(2014年,
并与 SQL Server 2005 匹配)中,
降序排序为:
Position by highest-to-lowest value:
A B C D E F | 8 9 | 7 6 | 5 4 | 3 2 1 0
由于SQL Server的newsequentialid
利用此排序进行索引友好的GUID生成,因此这种行为可能永远不会改变。 SQL Server还必须在所有系统中维护此行为以支持复制。因此,如果问题涉及SQL Server,我肯定会说“在SQL Server中GUID有一致的排序”,可以完全依赖于SQL Server。
然而,这种排序与.NET的GUID排序不同,如果PostgreSQL中的排序不同,我也不会感到惊讶。 SQL Server中的“翻转”差异是因为它遵循COM GUIDs的“Variant 2”(又名小端)排序;即使对于“Variant 1” UUIDs也是如此。(但是,似乎更随意,因为为什么组本身从右到左排序:更多的是微软历史?)
有趣的问题仍然存在:在 PostgreSQL中,如何/在哪里指定了这个排序?如果没有很好地指定,是否仍然可以将实现视为行为公理?
此外
查看有关SQL Server UUID的更多详细信息;以及有关“为什么”存在这些差异的美味细节。
uuid_generate_v1
在PgSQL中是索引友好的和/或基于“时间”在PgSQL中排序良好,则是一个具体的细节。 - user2864740