【问题标题】:DatabaseMetaData.getColumns has strange column size for int valueDatabaseMetaData.getColumns 具有奇怪的 int 值列大小
【发布时间】:2020-02-08 21:56:54
【问题描述】:

我有一个 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

第三列显示列大小,例如布尔值 active 为 1 个字节。但是为什么 id 值(在 PostgreSQL 中是 int)显示 10 个字节而不是 4 个字节?

【问题讨论】:

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

标签: java postgresql jdbc


【解决方案1】:

DatabaseMetaData.getColumns 中所述(强调我的):

COLUMN_SIZE 列指定给定列的列大小。 对于数字数据,这是最大精度。对于字符数据,这是以字符为单位的长度。对于日期时间数据类型,这 是字符串表示的字符长度(假设 小数秒组件的最大允许精度)。为了 二进制数据,这是以字节为单位的长度。对于 ROWID 数据类型,这 是以字节为单位的长度。对于其中的数据类型返回 Null 列大小不适用。

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 2020-07-13
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    相关资源
    最近更新 更多