PostgreSQL中能否将UUID存储于bit varying(16)类型列?
UUID存储到bit varying(16)列的可行性及解决方案
核心结论:无法用bit varying(16)存储UUID
标准UUID是**128位(16字节)**的唯一标识符,而bit varying(16)仅能存储最多16个二进制位(2字节),两者容量差距悬殊——16位最多只能表示65536种不同值,完全无法容纳UUID的海量唯一标识空间,因此直接存储是不可能的。
若为笔误(目标是bit varying(128)):PostgreSQL的转换方法
如果实际需要将UUID存储到bit varying(128)列中,PostgreSQL可以通过内置函数或自定义函数实现转换:
1. 内置函数转换(PostgreSQL 14+)
利用uuid_send()将UUID转为bytea,再通过bit()和bit_to_bytea()完成双向转换:
-- UUID 转 bit varying(128) SELECT bit(uuid_send('a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11'), 128)::bit varying(128); -- bit varying(128) 转回 UUID SELECT uuid_recv(bit_to_bytea('10100000111011101011110010011001100111000000101101001110111110001011101101101110101110011011110100111000000010100001'::bit(128)));
2. 自定义函数(兼容低版本PostgreSQL)
对于14以下版本,可自定义函数实现互转:
-- UUID 转 bit varying(128) CREATE OR REPLACE FUNCTION uuid_to_bitvar(uuid) RETURNS bit varying(128) AS $$ BEGIN RETURN (SELECT string_agg(lpad(to_byte::text, 8, '0'), '') FROM unnest(string_to_array(uuid_send($1)::text, '\x')) AS bytes(to_byte))::bit varying(128); END; $$ LANGUAGE plpgsql; -- bit varying(128) 转回 UUID CREATE OR REPLACE FUNCTION bitvar_to_uuid(bit varying(128)) RETURNS uuid AS $$ BEGIN RETURN uuid_recv(decode(regexp_replace($1::text, '(.{8})', '\1 ', 'g'), 'bit')); END; $$ LANGUAGE plpgsql;
内容的提问来源于stack exchange,提问作者Tomek Nowak
相关产品推荐
相关产品推荐

