Firebird数据类型列字段不正确

时间:2014-08-05 12:20:00

标签: sql firebird sqldatatypes datefield

我试图提取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结果: enter image description here

IBExpert DDL: enter image description here

2 个答案:

答案 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。