PostgreSQL: как вывести список всех доступных типов данных?

Вопрос:

Как в PostgreSQL (используя SQL, а не консоль) перечислить все доступные типы данных?

В идеале так: http://www.java2s.com/Code/PostgreSQL/Postgre-SQL/Displaysalldatatypesintheconnecteddatabasewithcomments.htm

В нем также должны быть указаны пользовательские типы, если они есть.
Так же, как список в pgAdmin3, где вы определяете тип данных для нового столбца в таблице.


person Stefan Steiger    schedule 02.05.2013    source источник


Ответы (2)


«Типы данных» в PostgreSQL на самом деле включают в себя примитивные (встроенные) типы, типы, добавляемые расширениями, определяемые пользователем составные типы, домены и типы строк таблиц. Непонятно, какие из них вас интересуют. Все типы, доступные в данной базе данных, перечислены в pg_catalog.pg_type этой базы данных, поэтому вам может потребоваться отфильтровать результаты. См. документацию по pg_type таблице системного каталога.

Типы доступных, но не установленных расширений не перечислены. Невозможно перечислить типы, предоставляемые расширениями, не установленными в текущей базе данных.

Чтобы получить более красивый список типов, используйте команду psql \dT *. Вы можете увидеть базовый SQL, который выполняется, запустив psql с флагом -E:

$ psql -E regress
regress=> \dT *
********* QUERY **********
SELECT n.nspname as "Schema",
  pg_catalog.format_type(t.oid, NULL) AS "Name",
  pg_catalog.obj_description(t.oid, 'pg_type') as "Description"
FROM pg_catalog.pg_type t
     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
WHERE (t.typrelid = 0 OR (SELECT c.relkind = 'c' FROM pg_catalog.pg_class c WHERE c.oid = t.typrelid))
  AND NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type el WHERE el.oid = t.typelem AND el.typarray = t.oid)
  AND pg_catalog.pg_type_is_visible(t.oid)
ORDER BY 1, 2;
**************************
person Craig Ringer    schedule 03.05.2013
comment
Знаете ли вы, согласованы ли OID для встроенных типов в экземплярах и версиях сервера? Например, всегда ли тип date будет 1082? - person ps2goat; 20.07.2019
comment
@ps2goat Для встроенных типов, не являющихся расширениями, да, oids согласуются, но вы не должны полагаться на это во всем, что вы распространяете, ожидаете, что оно будет переносимым и т. д. Это не гарантируется. - person Craig Ringer; 23.07.2019

select * from pg_type;

pg_type

person Clodoaldo Neto    schedule 02.05.2013
comment
вы хотите перечислить все типы в вашей конкретной базе данных или все типы данных, доступные в Postgres? - person Borys; 02.05.2013