DatabaseMetaData.getColumns имеет странный размер столбца для значения int - PullRequest
0 голосов
/ 09 февраля 2020

У меня есть 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 байт. Но почему он показывает 10 байтов для значения id (которое равно int в PostgreSQL) вместо 4?

1 Ответ

1 голос
/ 09 февраля 2020

Как указано в DatabaseMetaData.getColumns (выделено):

Столбец COLUMN_SIZE определяет размер столбца для данного столбца. Для числовых данных c это максимальная точность. Для символьных данных это длина в символах. Для типов данных datetime это длина в символах представления String (при условии максимально допустимой точности компонента долей секунды). Для двоичных данных это длина в байтах. Для типа данных ROWID это длина в байтах. Нулевое значение возвращается для типов данных, для которых размер столбца не применим.

Максимальная точность 32-разрядного целого числа равна 10, максимальная точность 64-разрядного целого числа (длинного) составляет 19.

Другими словами, ваше предположение, что COLUMN_SIZE содержит размер в байтах, неверно. Результат getColumns не предоставляет эту информацию, за исключением типов символов в столбце CHAR_OCTET_LENGTH.

Определение COLUMN_SIZE получено из интерфейса командной строки X / Open SQL, который в измененной форме живет в стандарте интерфейса уровня вызовов (SQL / CLI) (ISO-9075-3), в частности, из функции DescribeCol (цитируется по проекту ISO-9075-3: 2003):

b) Случай:
i) Если тип данных C является символьной строкой, то для ColumnSize задается максимальная длина в октетах C.
ii) Если тип данных C является точной цифрой c или приблизительной цифрой c, тогда для ColumnSize задается максимальная длина C в десятичных цифрах.
iii) Если тип данных C является датой-временем или интервалом, то ColumnSize устанавливается на длину в позициях C.
iv) Если тип данных C является ссылочным типом, то ColumnSize устанавливается на длину в октетах этого ссылочного типа.
v) В противном случае для ColumnSize устанавливается значение, зависящее от реализации.

...