首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解释RDB$FORMATS查询结果

如何解释RDB$FORMATS查询结果
EN

Stack Overflow用户
提问于 2017-11-08 15:55:22
回答 1查看 209关注 0票数 4

为了获取表模式更改的历史记录,我运行了以下查询:

代码语言:javascript
复制
select CAST(SUBSTRING(f.rdb$descriptor FROM 1 FOR 32000) AS VARCHAR(32000)) log 
from rdb$formats f
join rdb$relations r on r.rdb$relation_id = f.rdb$relation_id
where r.rdb$relation_name = 'MY_TABLE_NAME'

文档声明如下:

RDB$DESCRIPTOR \ BLOB格式\ Stores 列名称和数据属性为BLOB,因为它们在创建格式记录时是这样的

以下是查询的结果:

代码语言:javascript
复制
LOG                                                  TABLE FORMAT ID
-------------------------------------------------    ----------------       
4: type=9 (LONG) length=4 sub_type=0 flags=0x0       15
8: type=9 (LONG) length=4 sub_type=0 flags=0x0   
12: type=14 (DATE) length=4 sub_type=0 flags=0x0 
16: type=9 (LONG) length=4 sub_type=0 flags=0x0  
20: type=9 (LONG) length=4 sub_type=0 flags=0x0  
24 <-- probably truncated?
-------------------------------------------------    ----------------
4: type=9 (LONG) length=4 sub_type=0 flags=0x0       16
8: type=3 (VARCHAR) length=12 sub_type=52 flags=0x0
20: type=14 (DATE) length=4 sub_type=0 flags=0x0
24: type=9 (LONG) length=4 sub_type=0 flags=0x0
28: type=9 (LONG) length=4 sub_type=0 flags=0x0

表共有28行事件。但我不明白数字4,8,12,16,20,24,28背后的含义。好的,让我们发出以下查询:

代码语言:javascript
复制
SELECT
    RF.RDB$FIELD_POSITION,
    RF.RDB$FIELD_ID,
    F.RDB$FIELD_TYPE,
    F.RDB$FIELD_SUB_TYPE
FROM RDB$RELATION_FIELDS RF
JOIN RDB$FIELDS F ON (F.RDB$FIELD_NAME = RF.RDB$FIELD_SOURCE)
WHERE RF.RDB$RELATION_NAME = 'MY_TABLE_NAME'
ORDER BY RF.RDB$FIELD_POSITION;

以下是研究结果:

如您所见,我只有22列,positionid都无法匹配上面日志中的24/28键。

另一个发现是日志中有一个带有type=3 (VARCHAR)sub_type=52,而37是VARCHAR的代码。

这是怎么回事?我该怎么解释呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-08 16:08:05

我不明白数字4,8,12,16,20,24,28背后的含义

这些是解压缩内存缓冲区中的字节指针偏移量。

所有Format=15行都有相同的"length=4“列。

这正是"4,8,12,16,20,24“的区别所在。

在Format=16行中,长度为4、12、4、4、4

而这些是匹配之间的差距: 4,8,20,24,28。

  • 指针1+偏移量1=指针2
  • 指针2+偏移量2=指针3
  • 等等

如果您需要进入低级别,那么请阅读低级别文档:

  • "API指南“- https://www.firebirdsql.org/en/reference-manuals/
  • "Firebird内部部件(工作正在进行中)“-与上面的链接相同
  • c:\Program Files\Firebird\Firebird_2_1\include\ibase.h - dtype_XXX及相关常数
  • FLOSS低级库解析内存中的结构,如IB++在C++中或UIB在Pascal中.它们解析这些类型和子类型,以有意义的方式解释内存中的原始数据。

select CAST(SUBSTRING....

既然您提到了IBExpert,我建议您使用它内置的BLOB查看器查看内部的RDB$Formats.rdb$descriptor值。您的日志中缺少一个参数,这对于数字字段非常重要。下面是某个表的转储。

代码语言:javascript
复制
Type=16 Scale=0 Length=8 Subtype=0 Flags=0 Offset=8
Type=17 Scale=4 Length=8 Subtype=1 Flags=0 Offset=16

而37是VARCHAR的代码。

再说一遍,阅读资料来源- ibase.h

代码语言:javascript
复制
   #define blr_varying             (unsigned char)37
   #define blr_varying2            (unsigned char)38  

BLR代表二进制语言表示--它是内部Firebird的字节码,它的私有半编译“虚拟机”。我真的不认为你真的想深入到低层次的实施细节。

更新:“而37是VARCHAR的代码”实际上是直接记录在相应的表描述中:

manuals/fblangref25-en/html/fblangref-appx04-fields.html

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47184123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档