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是动态分配的,无法提前固化到驱动中。你可以通过以下方式获取:
- 查询系统表
pg_type:SELECT oid FROM pg_type WHERE typname = '你的复合类型名称' AND typnamespace = (SELECT oid FROM pg_namespace WHERE nspname = '对应的模式名'); - 通过
ResultSetMetaData获取:如果查询结果包含复合类型的列,调用resultSetMetaData.getColumnType(columnIndex)即可获取该列的类型OID。 - 通过
DatabaseMetaData查询:调用getTypes()方法遍历所有类型,结合类型名称、模式名筛选出目标复合类型。
内容的提问来源于stack exchange,提问作者DannyPoet
相关产品推荐
相关产品推荐

