火鸟列表域和数据类型

时间:2018-07-05 11:46:16

标签: firebird ibexpert

我想列出所有域,它们的数据类型和大小。

背景

我已经设法基于this SO answer进行查询。

基本代码包含所有字段:

SELECT
  *
FROM
  rdb$fields

我发现我可以从rdb$fields中获取字段:

  1. RDB$FIELD_NAME
  2. 过滤此请求中的字段
  3. RDB$FIELD_TYPE中获取字段类型代码
  4. RDB$FIELD_LENGTH中获取字段长度

参考:

https://firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref-appx04-fields.html


问题

如何将所有这些结合起来以列出所有域,其数据类型和大小?

我只想获取用户创建的域,而不是自动创建的域。

1 个答案:

答案 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对其进行硬编码。

感谢评论中的帮助:

@MarkRotteveel

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

@Arioch

获取用户域的最可靠方法:

  

在一定程度上可以使用select * from rdb$fields where coalesce( rdb$system_flag, 0) = 0 and not ( rdb$field_name starting with 'RDB$')   但是没有人禁止用户手动/明确创建列   名为“ RDB $ 1234567”。