1

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

背景

我已经设法根据这个 SO answer进行查询。

基本代码采用所有字段:

SELECT
  *
FROM
  rdb$fields

我发现我可以从以下位置获取字段rdb$fields

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

参考:

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


问题

如何结合所有这些来列出所有域、它们的数据类型和大小?

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

4

1 回答 1

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$')

同样有趣的是,我找不到具有数据类型的系统表。必须从参考中对它们进行硬编码。

感谢评论中的帮助:

@MarkRotteveel

RDB$TYPE包含类型,但名称不同:

您可以在 for RDB$FIELD_NAME = 'RDB$FIELD_TYPE' 中找到所有数据类型RDB$TYPE(尽管您需要映射一些类型,因为它将 SMALLINT 列为 SHORT,INTEGER 列为 LONG,BIGINT 列为 INT64,VARCHAR 列为 VARYING)

需要使用字段RDB$CHARACTER_LENGTH而不是RDB$FIELD_LENGTH.

请注意,RDB$FIELD_LENGTH 是 char/varchar 列的错误列,因为它是以字节为单位的长度(取决于字符集),您需要使用RDB$CHARACTER_LENGTH字符长度,对于数字字段,您更有可能需要 RDB$FIELD_PRECISION (+ RDB$FIELD_SCALE),你也忽略了子类型信息。

我只需要 varchars 的长度,但出现 RDB$FIELD_LENGTH = RDB$CHARACTER_LENGTH, 1 byte = 1 char for 1 byte character set

如果您使用 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”的列。

于 2018-07-05T11:48:07.920 回答