为了获取表模式更改的历史记录,我运行了以下查询:
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,因为它们在创建格式记录时是这样的
以下是查询的结果:
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背后的含义。好的,让我们发出以下查询:
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列,position和id都无法匹配上面日志中的24/28键。
另一个发现是日志中有一个带有type=3 (VARCHAR)的sub_type=52,而37是VARCHAR的代码。
这是怎么回事?我该怎么解释呢?
发布于 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。
如果您需要进入低级别,那么请阅读低级别文档:
c:\Program Files\Firebird\Firebird_2_1\include\ibase.h - dtype_XXX及相关常数
select CAST(SUBSTRING....
既然您提到了IBExpert,我建议您使用它内置的BLOB查看器查看内部的RDB$Formats.rdb$descriptor值。您的日志中缺少一个参数,这对于数字字段非常重要。下面是某个表的转储。
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
#define blr_varying (unsigned char)37
#define blr_varying2 (unsigned char)38 BLR代表二进制语言表示--它是内部Firebird的字节码,它的私有半编译“虚拟机”。我真的不认为你真的想深入到低层次的实施细节。
更新:“而37是VARCHAR的代码”实际上是直接记录在相应的表描述中:
https://stackoverflow.com/questions/47184123
复制相似问题