You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL中复合类型列OID里0x6000的意义是什么?

PostgreSQL OID范围与复合类型相关问题解答

关于0x6000(24576)的含义

0x6000对应十进制的24576,在PostgreSQL中它是用户自定义对象与系统内置对象的OID分界点,对应源码中的FirstNormalObjectId常量:

  • 系统内置对象(包括int、varchar这类内置数据类型、系统表、系统函数等)的OID均小于这个值;
  • 所有用户创建的对象(用户表、用户自定义复合类型、用户函数、序列等)的OID都会从这个值开始分配,因此你观察到的用户复合类型、用户表OID都高于0x6000。

它并非复合类型的专属起始值,而是所有用户自定义对象的OID起始阈值。

关于复合类型的OID

0x6024只是某个具体用户自定义复合类型的唯一OID,不是所有复合类型的固定标识。每个用户创建的复合类型都会被分配一个唯一的、大于等于0x6000的OID,不同数据库实例、不同复合类型的OID可能存在差异。

PostgreSQL JDBC中获取复合类型OID的方法

JDBC驱动仅预定义了内置类型的OID常量,因为用户自定义复合类型的OID是动态分配的,无法提前固化到驱动中。你可以通过以下方式获取:

  1. 查询系统表pg_type:
    SELECT oid 
    FROM pg_type 
    WHERE typname = '你的复合类型名称' 
      AND typnamespace = (SELECT oid FROM pg_namespace WHERE nspname = '对应的模式名');
    
  2. 通过ResultSetMetaData获取:如果查询结果包含复合类型的列,调用resultSetMetaData.getColumnType(columnIndex)即可获取该列的类型OID。
  3. 通过DatabaseMetaData查询:调用getTypes()方法遍历所有类型,结合类型名称、模式名筛选出目标复合类型。

内容的提问来源于stack exchange,提问作者DannyPoet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 02:45:02