8.12. UUID 类型 #
uuid 数据类型用于存储由
RFC 9562、ISO/IEC 9834-8:2005 及相关标准定义的通用唯一标识符(UUID)。(有些系统把这种数据类型称为全局唯一标识符,或 GUID。)这种标识符是一个
128 位的量,由某种算法生成,该算法的设计目标是:使已知宇宙中其他人用同一算法生成出相同标识符的概率极低。因此,对于分布式系统而言,这类标识符能比序列生成器提供更好的唯一性保证,因为序列生成器仅在单个数据库内唯一。
RFC 9562 定义了 8 种不同的 UUID 版本。每个版本对生成新 UUID 值都有各自的要求,也各自具备不同的优缺点。PostgreSQL 原生支持使用 UUIDv4 和
UUIDv7 算法生成 UUID。或者,也可以在数据库外部使用任意算法生成
UUID 值。uuid 数据类型可用于存储任何 UUID,无论其来源和版本为何。UUID 按其 128 位值进行字典序比较。UUIDv7 值在最高有效位中嵌入 Unix 时间戳,因此这种排序与时间先后顺序一致,适合用于 min() 和 max() 等聚合函数。
UUID 写作一串小写十六进制数字,并用连字符分隔成若干组:先是 8 位一组,接着是三个 4 位组,最后是一个 12 位组。总共 32 个十六进制数字表示 128 个二进制位。标准形式的 UUID 例如:
a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11
PostgreSQL 也接受其他输入形式:可以使用大写字母、用花括号包围标准格式、省略部分或全部连字符,或者在任意 4 位分组后额外加上连字符。例如:
A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11
{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}
a0eebc999c0b4ef8bb6d6bb9bd380a11
a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11
{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}
输出总是采用标准形式。
还可以将 uuid 值转换为 bytea,以及从
bytea 转回 uuid。这对于结合
encode() 和 decode()
等函数处理 UUID 值很有用。例如:
encode('1ea3d64c-bc40-4cc3-84bb-6b11ee31e5c2'::uuid::bytea, 'base64')
decode('HqPWTLxATMOEu2sR7jHlwg==', 'base64')::uuid
关于如何在 PostgreSQL 中生成 UUID,请参见第 9.15 节。