我想列出所有域,它们的数据类型和大小。
我已经设法基于this SO answer进行查询。
基本代码包含所有字段:
SELECT
*
FROM
rdb$fields
我发现我可以从rdb$fields
中获取字段:
RDB$FIELD_NAME
RDB$FIELD_TYPE
中获取字段类型代码RDB$FIELD_LENGTH
中获取字段长度参考:
如何将所有这些结合起来以列出所有域,其数据类型和大小?
我只想获取用户创建的域,而不是自动创建的域。
答案 0 :(得分:1)
代码:
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$')
同样有趣的是,我找不到具有数据类型的系统表。必须从reference对其进行硬编码。
感谢评论中的帮助:
RDB$TYPE
包含类型,但使用不同的名称:
您可以在
RDB$TYPE
中找到RDB $ FIELD_NAME =的所有数据类型= “ RDB $ FIELD_TYPE”(尽管您需要映射一些类型的列表) SMALLINT为SHORT,INTEGER为LONG,BIGINT为INT64,VARCHAR为 变化)
需要使用字段RDB$CHARACTER_LENGTH
而不是RDB$FIELD_LENGTH
。
请注意,对于char / varchar,RDB $ FIELD_LENGTH是错误的列 列,因为它是字节长度(取决于字符) 设置),则需要使用
RDB$CHARACTER_LENGTH
作为长度 字符,对于数字字段,您更有可能需要 RDB $ FIELD_PRECISION(+ RDB $ FIELD_SCALE),您也忽略了子 类型信息。
我只需要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”。