如何生成没有破折号的 uuid
Posted
技术标签:
【中文标题】如何生成没有破折号的 uuid【英文标题】:How to generate uuids without dashes 【发布时间】:2016-11-21 16:17:22 【问题描述】:我正在创建一个具有以下表定义的表
CREATE TABLE auth(
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
role VARCHAR(64)
);
生成的 uuid 格式为 a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11
我知道 postgres 也接受不带连字符的 uuid。我们如何指定自动生成的 uuid 中没有连字符?
【问题讨论】:
UUID 数据类型不包含破折号。只有当您显示数据时才会显示破折号。类似于没有格式的 DATE。 哇!我可以使用不带连字符的 uuid 进行查询! 手册中有详细记录:postgresql.org/docs/current/static/datatype-uuid.html Postgres 支持不同的 'format
uuid 版本。除此之外,各种格式的使用评估相同(即 '`a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11':: uuid = 'a0eebc999c0b4ef8bb6d-6bb9bd380a11::uuid' 评估为 TRUE。但在生成时它总是在 带有破折号的标准格式。请参阅Documentation。要消除破折号,将 uuid 列转换为文本,然后使用替换删除:replace(这是一个可行的解决方案,可以实现接近您所要求的目标:
CREATE TABLE foo (
ts TIMESTAMP WITH TIME ZONE,
uuid VARCHAR DEFAULT REPLACE(uuid_generate_v4()::text, '-', '' )
);
INSERT INTO foo ( ts ) VALUES ( now() );
但是(它是一个大但是)在这里我们将uuid
转换为string
,这意味着索引本身将比数字或真实的uuid
贵得多.
在这篇文章中你可以找到一个很好的解释:https://tomharrisonjr.com/uuid-or-guid-as-primary-keys-be-careful-7b2aa3dcb439
据我所知,Postgres 的uuid
使用连字符,即使您尝试删除它们:
CREATE TABLE foo (
ts TIMESTAMP WITH TIME ZONE,
queue UUID DEFAULT REPLACE(uuid_generate_v4()::text, '-', '' )::uuid,
);
INSERT INTO foo ( ts ) VALUES ( now() );
上面的例子在 Postgres 9.6 中工作得很好,但是当我们转换回 uuid
时,连字符会被添加回来。
【讨论】:
连字符不存储在列中。它们仅在您显示值时生成。以上是关于如何生成没有破折号的 uuid的主要内容,如果未能解决你的问题,请参考以下文章