Хотя ни в коем случае не окончательный ответ - т.е. «определено ли поведение для всех установок 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
Поскольку newsequentialid
SQL Server использует этот порядок для генерации GUID, удобного для индекса, поведение, вероятно, никогда не изменится. SQL Server также должен поддерживать это поведение во всех системах для поддержки репликации. Таким образом, если бы вопрос касался SQL Server, я бы определенно сказал, что «существует согласованный порядок идентификаторов GUID в SQL Server», на который можно абсолютно положиться в SQL Server.
Однако этот порядок отличается от порядка GUID в .NET, и я не удивлюсь, если порядок в PostgreSQL будет другим. «Переворачивающиеся» различия в SQL Server связаны с тем, что он следует упорядочение COM GUID в варианте 2 (также известном как прямой порядок следования байтов); это делается даже для UUID «Вариант 1». (Однако кажется более произвольным, почему сами группы упорядочены справа налево: больше истории Microsoft?)
Остается интересный вопрос: где/как это указано для заказа в PostgreSQL? Если это не точно определено, можно ли по-прежнему рассматривать реализацию как аксиому поведения?
Также см. этот вопрос для получения более подробной информации об UUID SQL Server; и вкусные подробности о том, «почему» существуют эти различия.
person
user2864740
schedule
02.11.2018
uuid_generate_v1
удобен для индекса PgSQL и/или хорошо упорядочен в PgSQL на основе «времени», это конкретная деталь. - person user2864740   schedule 01.11.2018