我正在实现一个PostgreSQL驱动程序,得到一条RowDescription
消息和一些DataRow
消息来响应数据库查询。但如何获取返回列的类型?例如,第一列应为int
,第二列应为varchar(20)
。
以下是RowDescription
的一些打印输出:
[RowDescription] 2 rows
[Row] id
tableObjId: 16393
attrNr: 1
objId: 23
dataTypeSz: 4
typeModifier: -1
formatCode: 0
[Row] name
tableObjId: 16393
attrNr: 2
objId: 1043
dataTypeSz: -1
typeModifier: 24
formatCode: 0
对于
DataRow
:[DataRow] 2 columns
data: 2
data: Jonas
[DataRow] 2 columns
data: 76
data: Anders
有什么建议吗?这是我必须在任何系统表中查找的内容吗?
最佳答案
objId
是列类型对pg_type.oid
的引用。23为int4
,1043为varchar
(select * from pg_type where oid in (23,1043)
)
第二列的类型修饰符应该指示varchar上的限定符,尽管我不太确定为什么它是24而不是20。可能是因为这是返回的varlena结构的长度,它前面有一个32位的长度。总之,typmod就是这样工作的:如果您这样做,您将看到输出是select pg_catalog.format_type(1043, 24)
。documentation for PQfmod表示typmod解释是类型特定的。