编码:
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”的列。