firebird - Firebird 列出域和数据类型
问题描述
我想列出所有域、它们的数据类型和大小。
背景
我已经设法根据这个 SO answer进行查询。
基本代码采用所有字段:
SELECT
*
FROM
rdb$fields
我发现我可以从以下位置获取字段rdb$fields
:
- 过滤此请求中的字段
RDB$FIELD_NAME
- 获取字段类型代码
RDB$FIELD_TYPE
- 获取字段长度
RDB$FIELD_LENGTH
参考:
问题
如何结合所有这些来列出所有域、它们的数据类型和大小?
我只想获取用户创建的域,而不是自动创建的域。
解决方案
编码:
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”的列。
推荐阅读
- node-red - 如何拆分和格式化 2 条消息以避免 NODE-RED 中的循环?
- python - Def 函数没有调用我创建的列表
- java - 为什么这种合并排序的实现不起作用?
- mysql - SQL:在一个请求中从多个表中获取信息
- sql - 如何将表格数据更改为三个不同的值
- react-admin - 如何使用 POST 方法列出 RA 中的数据
- javascript - 我可以过滤一个在其他集合中具有 _id 的集合并在 mongodb 中有结果吗
- html - 如何将圆角和阴影应用于带边框的表格?
- android - 在 notifyDataSetChanged 后 Listitem 的自定义布局未更新
- python-3.x - 在 PySpark/Python RDD 中过滤