uuid Oracle PG 转化 bytea
Oracle中生成跨系统的唯一识别符UUID非常方便,比生成序列还简单,直接用sys_guid()就行,例如
select sys_guid() from dual;
会产生一个跟MAC地址、生成时间相关的一个32位16进制的随机数。
直接认准SYS_GUID()——它是 Oracle 唯一原生、无需额外权限、跨版本稳定的全局唯一标识生成方式。
SYS_GUID()是服务器端生成,依赖 Oracle 实例的 MAC 地址 + 时间戳 + 进程 ID,保证集群内唯一- 性能比序列 + 触发器高,无锁争用,适合高并发插入场景
- 但注意:它不保证单调递增,不适合做主键索引(会导致索引分裂),除非你用反向键索引或换成
IDENTITY列
可能我们的uuid 做PK导致index 碎片多
RAC :
序列只在单实例内唯一,跨 RAC 节点需要ORDER和缓存控制,而SYS_GUID()天然支持 RAC,每个节点生成的 RAW 值从物理源头就隔离。
数据类型是 raw(16) 有32个字符。
它的生成机制足以保证全球所有系统产生的海量guid重复可能性非常小。这在AIXM概念中非常重要。
如果要让返回的uuid满足标准格式,可利用如下函数实现:
create or replace FUNCTION GET_UUID RETURN VARCHAR AS
guid VARCHAR2 (64);
BEGIN
guid := lower(RAWTOHEX(sys_guid()));
RETURN substr(guid,1,8)||'-'||substr(guid,9,4)||'-'||substr(guid,13,4)||'-'||substr(guid,17,4)||'-'||substr(guid,21,12);
END GET_UUID;
select get_uuid from dual;
得到结果:a8f662b8-6e7a-13fe-e040-970a437c6bd7