PostgreSQL中是否有将UUID(RFC 4122)转换为OID(ISO 8824)的功能?
“2.25.”后面的值是UUID整数的直接十进制编码。它必须是单个整数的直接十进制编码,全部为128位。它不能被分解为多个部分。
例如,该函数将采用UUID "f81d4fae-7dec-11d0-a765-00a0c91e6bf6"
并返回OID "2.25.329800735698586629295641978511506172918"
。
参考文献:
PostgreSQL中是否有将UUID(RFC 4122)转换为OID(ISO 8824)的功能?
“2.25.”后面的值是UUID整数的直接十进制编码。它必须是单个整数的直接十进制编码,全部为128位。它不能被分解为多个部分。
例如,该函数将采用UUID "f81d4fae-7dec-11d0-a765-00a0c91e6bf6"
并返回OID "2.25.329800735698586629295641978511506172918"
。
参考文献:
1条答案
按热度按时间dba5bblo1#
uint16
)和一个注册的转换uuid --> uint16
(它可能是也可能不是内部二进制兼容的,这使得它非常便宜)。您可以使用(非官方的!)附加模块
pg_bignum
或Evan Caroll's (even more unofficial) fork来直接接受十六进制输入。(免责声明:未经测试。)这些模块在大多数托管安装中不可用。下面是一个穷人使用标准PostgreSQL内置工具的实现:
第一个
电话:
生成请求的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()
快一点点。还应考虑函数的注解。