我试图提取Firebird 1.5表格的结构。 我设法获取数据,但有一个字段显示IBExpert数字和我的选择显示如何加倍。
该字段为TR_VALOR。 SQL返回小数和IBExpert DDL数字。
返回select * from RDB$TYPES where RDB$TYPE = 27
,这:RDB $ TYPE_NAME = Double。
为什么会出现这种差异?这两个案例如何返回相同的内容?
SQL:
SELECT
a.RDB$FIELD_NAME Coluna,
RDB$TYPE_NAME Tipo,
RDB$FIELD_LENGTH Tamanho,
RDB$FIELD_SCALE Escala,
b.*
FROM
RDB$RELATION_FIELDS a
JOIN RDB$FIELDS b ON b.RDB$FIELD_NAME = a.RDB$FIELD_SOURCE
inner join RDB$TYPES c on c.RDB$TYPE = b.RDB$FIELD_TYPE
WHERE
a.RDB$RELATION_NAME = 'TRANSACAO' and c.RDB$FIELD_NAME = 'RDB$FIELD_TYPE'
order by
a.RDB$FIELD_POSITION;
SQL结果:
IBExpert DDL:
答案 0 :(得分:4)
对于NUMERIC或DECIMAL(基本相同),它在系统表中非常混乱。
如果sub_type为1,则将其定义为NUMERIC,如果为2,则为DECIMAL。在0的情况下,但是SCALE<> 0,可以认为是NUMERIC。如果subtype = 0且scale = 0,则它是原始的DOUBLE。
请注意,TYPE也可以是7(int16),8(int32)或16(int64)。同样的规则适用于上述情况。
在创建此数据类型的新列时,Firebird会尝试使用最小的本机数据类型来匹配规范,因此int16,int32,int64和Dialect 1中的双精度数。
希望这有帮助。
答案 1 :(得分:1)
您也应该分析RDB $ FIELD_SUB_TYPE。 值1表示NUMERIC,2表示DECIMAL。