如何获取系统随机UUID_SYS_GUID函数生成全局唯一标识

张开发
2026/4/11 7:16:48 15 分钟阅读

分享文章

如何获取系统随机UUID_SYS_GUID函数生成全局唯一标识
SYS_GUID() 返回 RAW(16) 类型是二进制数据而非字符串需用 RAWTOHEX 或 TO_CHAR 转为十六进制字符串不可直接拼接或模糊匹配JDBC 中须用 getBytes() 获取再转换。Oracle 里 SYS_GUID() 返回的是什么类型它返回的是 raw(16)不是字符串。直接 select sys_guid() from dual 看起来像一串十六进制但本质是二进制数据——这意味着你不能直接拼接、like 模糊匹配或当普通字符串传给某些 jdbc 驱动比如老版本 oracle jdbc 会报 ora-00932: inconsistent datatypes。常见错误现象在 MyBatis 或 Spring JDBC 中用 #{id} 接收 SYS_GUID() 结果却收到空值或类型转换异常或者把结果插入 VARCHAR2 字段时没显式转码导致乱码或截断。要用 TO_CHAR(SYS_GUID(), XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX) 转成 32 位小写十六进制字符串注意Oracle 12c 支持该格式旧版需用 RAWTOHEX(SYS_GUID())如果字段是 CHAR(36) 并想带连字符如 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx得自己拼接SYS_GUID() 本身不生成带分隔符的格式别在应用层靠 UUID.randomUUID().toString() 模拟——字节序、版本号、随机性来源都不同无法和数据库侧对齐为什么不用 NEWID() 或 UUID()因为它们根本不是 Oracle 的函数。NEWID() 是 SQL Server 的UUID() 是 PostgreSQL 的 gen_random_uuid() 或 MySQL 的 UUID()在 Oracle 里执行只会报 ORA-00904: NEWID: invalid identifier。有人误以为 Oracle 支持标准 SQL 的 UUID 函数其实直到 22c 才有实验性 GENERATE_UUID()仍非默认启用。所以别搜“Oracle UUID 函数”直接认准 SYS_GUID()——它是 Oracle 唯一原生、无需额外权限、跨版本稳定的全局唯一标识生成方式。SYS_GUID() 是服务器端生成依赖 Oracle 实例的 MAC 地址 时间戳 进程 ID保证集群内唯一性能比序列 触发器高无锁争用适合高并发插入场景但注意它不保证单调递增不适合做主键索引会导致索引分裂除非你用反向键索引或换成 IDENTITY 列Java 应用里怎么安全取到 SYS_GUID() 结果JDBC 默认把 RAW 映射为 byte[]不是 String。如果你用 ResultSet.getString() 读 SYS_GUID()多数驱动会返回 null 或抛异常尤其 Oracle 11g 的 ojdbc6.jar。正确做法是明确按 RAW 处理再转十六进制字符串 灵办AI 免费一键快速抠图支持下载高清图片

更多文章