Java DatabaseMetaData.getColumns的int值具有奇怪的列大小

Java DatabaseMetaData.getColumns的int值具有奇怪的列大小,java,postgresql,jdbc,Java,Postgresql,Jdbc,我有一个PostgreSQL表 create table test ( id int, name varchar(2), active boolean, long_id bigint, created timestamptz); ) 我想得到这个表中每一列的名称、类型和大小。这是我的代码: public static void main(final String[] args) throws SQLException { final Connection connection

我有一个PostgreSQL表

create table test (
id int,
name varchar(2),
active boolean,
long_id bigint,
created timestamptz);
)
我想得到这个表中每一列的名称、类型和大小。这是我的代码:

public static void main(final String[] args) throws SQLException {
        final Connection connection = DriverManager.getConnection("jdbc:postgresql://127.0.0.1:5432/test", "postgres", "123");
        final DatabaseMetaData metaData = connection.getMetaData();
        try (final ResultSet resultSet = metaData.getColumns("public", null, "test", null)) {
            while (resultSet.next()) {
                System.out.println(resultSet.getString("COLUMN_NAME") + " " + resultSet.getInt("DATA_TYPE") + " " + resultSet.getInt("COLUMN_SIZE"));
            }
        }
    }
这是输出

id 4 10
name 12 2
active -7 1
long_id -5 19
created 93 35
第三列显示列大小,例如,布尔值活动为1字节。但是为什么它显示10字节的id值(在PostgreSQL中是int)而不是4字节呢

如(矿山)中所述:

列大小列指定给定列的列大小。 对于数字数据,这是最大精度。对于字符数据,这是以字符为单位的长度。对于datetime数据类型,此 字符串表示形式的长度(以字符为单位)(假设 分数秒组件的最大允许精度)。对于 二进制数据,这是以字节为单位的长度。对于ROWID数据类型,此 是以字节为单位的长度。对于 列大小不适用

32位整数的最大精度为10,64位整数(长)的最大精度为19

换句话说,您认为
列大小
包含以字节为单位的大小的假设是错误的。除了列
CHAR\u OCTET\u LENGTH
中的字符类型外,
getColumns
结果不提供该信息

COLUMN\u SIZE
的定义源自X/Open SQL CLI,该CLI以修改后的形式存在于调用级接口(SQL/CLI)标准(ISO-9075-3)中,特别是来自
DescribeCol
函数(引用自ISO-9075-3:2003的草案):

b) 案例:
i) 如果C的数据类型为字符串,则ColumnSize设置为C的最大长度(以八位字节为单位)。
ii)如果C的数据类型为精确数字或近似数字,则ColumnSize设置为以十进制数字表示的C的最大长度。
iii)如果C的数据类型为datetime或interval,则ColumnSize设置为C位置的长度。
iv)如果C的数据类型是引用类型,则ColumnSize设置为该引用类型的长度(以八位字节为单位)。
v) 否则,ColumnSize将设置为依赖于实现的值


当您的问题是关于
DatabaseMetaData.getColumns
的结果集时,为什么您的问题的标题中有
ResultSetMetaData