PostgreSQL:将UUID转换为OID

lf3rwulv  于 2022-11-23  发布在  PostgreSQL
关注(0)|答案(1)|浏览(128)

PostgreSQL中是否有将UUID(RFC 4122)转换为OID(ISO 8824)的功能?
“2.25.”后面的值是UUID整数的直接十进制编码。它必须是单个整数的直接十进制编码,全部为128位。它不能被分解为多个部分。
例如,该函数将采用UUID "f81d4fae-7dec-11d0-a765-00a0c91e6bf6"并返回OID "2.25.329800735698586629295641978511506172918"
参考文献:

dba5bblo

dba5bblo1#

  • 理想情况下 *,我们会有一个无符号的16字节整数(uint16)和一个注册的转换uuid --> uint16(它可能是也可能不是内部二进制兼容的,这使得它非常便宜)。

您可以使用(非官方的!)附加模块pg_bignumEvan Caroll's (even more unofficial) fork来直接接受十六进制输入。(免责声明:未经测试。)
这些模块在大多数托管安装中不可用。下面是一个穷人使用标准PostgreSQL内置工具的实现:
第一个
电话:

SELECT f_uuid2oid('f81d4fae-7dec-11d0-a765-00a0c91e6bf6');

生成请求的OID 2.25.329800735698586629295641978511506172918
小提琴
根据https://www.rfc-editor.org/rfc/rfc3061,没有前导零。
我没有通读所有的各种标准:http://www.oid-info.com/faq.htm#1
我利用内置的(非常快的)二进制强制转换(从bit(n)bigint/integer),尽我所知优化了性能。

Postgres整数类型是 signed。因此-为了避免溢出为负数-我们不能使用完整的64位(8字节/ 16个十六进制数字),我们必须将32个十六进制数字转换为三个垃圾,而不是两个。我将其任意分割为15 + 15 + 2个十六进制数字。
使用left()right(),因为这通常比substring()快一点点。
还应考虑函数的注解。

相关问题