2012-09-12 3 views
1

Я пытаюсь выяснить, как определить размер конкретного столбца в базе данных, например, у меня есть два столбца с именем sourceip, destinationip, которые являются 16-байтовыми полями.Вычисление размера типа столбца в Postgresql

Я думал, что это будет где-то в information_schema или \ d +, но я не могу найти определенную команду для выделения размера каждого типа столбца.

Можете ли вы рассчитать размер столбца в базе данных или просто нужно указывать размер байта для каждого типа в документации Postgresql?

ответ

9

Только несколько типов в pg имеют фиксированную длину - почти все типы имеют тип varlena - он имеет динамическую длину. Вы можете проверить запросы как

postgres=# select typlen from pg_type where oid = 'int'::regtype::oid; 
    typlen 
-------- 
     4 
(1 row) 


postgres=# select attlen from pg_attribute where attrelid = 'x'::regclass and attname = 'a'; 
    attlen 
-------- 
     4 
(1 row) 

Когда результат не -1, то тип не фиксированной длины

для типов varlena использовать функцию pg_column_size:

postgres=# \df *size* 
            List of functions 
    Schema |   Name   | Result data type | Argument data types | Type 
------------+------------------------+------------------+---------------------+-------- 
pg_catalog | pg_column_size   | integer   | "any"    | normal 
pg_catalog | pg_database_size  | bigint   | name    | normal 
pg_catalog | pg_database_size  | bigint   | oid     | normal 
pg_catalog | pg_indexes_size  | bigint   | regclass   | normal 
pg_catalog | pg_relation_size  | bigint   | regclass   | normal 
pg_catalog | pg_relation_size  | bigint   | regclass, text  | normal 
pg_catalog | pg_size_pretty   | text    | bigint    | normal 
pg_catalog | pg_size_pretty   | text    | numeric    | normal 
pg_catalog | pg_table_size   | bigint   | regclass   | normal 
pg_catalog | pg_tablespace_size  | bigint   | name    | normal 
pg_catalog | pg_tablespace_size  | bigint   | oid     | normal 
pg_catalog | pg_total_relation_size | bigint   | regclass   | normal 
(12 rows) 



postgres=# select pg_column_size('Hello'); 
    pg_column_size 
---------------- 
      6 
(1 row) 

postgres=# select pg_column_size(10); 
    pg_column_size 
---------------- 
       4 
(1 row) 

postgres=# select pg_column_size(now()); 
    pg_column_size 
---------------- 
       8 
+0

Спасибо за помощь. Является ли выход в единицах байтов? – user7980

+0

Да, это ub байты –

Смежные вопросы