我有一个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值的10个字节(在PostgreSQL中为int)而不是4个字节?
如DatabaseMetaData.getColumns
(强调我的文档中所述:
COLUMN_SIZE列指定给定列的列大小。对于数字数据,这是最大精度。对于字符数据,这是字符长度。对于日期时间数据类型,此是String表示形式的字符长度(假设小数秒部分的最大允许精度)。对于二进制数据,这是字节长度。对于ROWID数据类型,此是字节的长度。对于其中列大小不适用。
[32位整数的最大精度为10,64位整数(长)的最大精度为19。
换句话说,您认为DatabaseMetaData.getColumns
包含以字节为单位的大小是错误的。 COLUMN_SIZE
结果不提供该信息,但getColumns
列中的字符类型除外。