код:
select
t.RDB$FIELD_NAME Name,
case t.RDB$FIELD_TYPE
when 7 then 'SMALLINT'
when 8 then 'INTEGER'
when 10 then 'FLOAT'
when 12 then 'DATE'
when 13 then 'TIME'
when 14 then 'CHAR'
when 16 then 'BIGINT'
when 27 then 'DOUBLE PRECISION'
when 35 then 'TIMESTAMP'
when 37 then 'VARCHAR'
when 261 then 'BLOB'
end Type_Name,
t.RDB$CHARACTER_LENGTH Chr_Length
from RDB$FIELDS t
where coalesce( rdb$system_flag, 0) = 0
and not ( rdb$field_name starting with 'RDB$')
Также интересно, я не смог найти системную таблицу с типами данных. Пришлось их жестко закодировать из ссылки .
Спасибо за помощь в комментариях:
@ MarkRotteveel
RDB$TYPE
содержит типы, но называет их по-разному:
Вы можете найти все типы данных в RDB$TYPE
для RDB $ FIELD_NAME =
'RDB $ FIELD_TYPE' (хотя вам нужно будет отобразить некоторые типы в списке
SMALLINT как КОРОТКИЙ, INTEGER как ДОЛГО, BIGINT как INT64 и VARCHAR как
VARYING)
Необходимо использовать поле RDB$CHARACTER_LENGTH
вместо RDB$FIELD_LENGTH
.
Обратите внимание, что RDB $ FIELD_LENGTH - неправильный столбец для char / varchar
столбцы, поскольку это длина в байтах (которая зависит от символа
установить), вам нужно использовать RDB$CHARACTER_LENGTH
для длины в
символов, а для числовых полей вам, скорее всего, понадобится
RDB $ FIELD_PRECISION (+ RDB $ FIELD_SCALE), вы также игнорируете sub
введите информацию.
Мне нужна была только длина varchars, но появляется RDB $ FIELD_LENGTH = RDB $ CHARACTER_LENGTH, 1 байт = 1 символ для 1-байтовый набор символов .
Если вы используете 1-байтовый набор символов [1 байт = 1 символ], но, например, UTF-8
(максимум) 4 байта на символ, поэтому field_length = 4 x
CHARACTER_LENGTH
@ Ариох
Самый надежный способ получить пользовательские домены:
В какой-то степени можно использовать select * from rdb$fields where coalesce(
rdb$system_flag, 0) = 0 and not ( rdb$field_name starting with 'RDB$')
однако никто не запрещает пользователю вручную / явно создавать столбец
с именем "RDB $ 1234567".