【问题标题】:Firebird Data Type column field is not correctFirebird 数据类型列字段不正确
【发布时间】:2014-08-05 12:19:59
【问题描述】:

我正在尝试提取 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:

【问题讨论】:

    标签: sql firebird sqldatatypes datefield


    【解决方案1】:

    对于 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,在方言 1 中为 double。

    希望这会有所帮助。

    【讨论】:

    • 请注意,这只是历史数据(并且仅适用于 Dialect 1 数据库),通常 Firebird 对(大)NUMERIC 和 DECIMAL 使用 BIGINT (INT64) 类型,而不是 DOUBLE。
    【解决方案2】:

    您也应该分析 RDB$FIELD_SUB_TYPE。 值 1 表示 NUMERIC,2 - DECIMAL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-28
      • 2012-07-06
      • 1970-01-01
      • 2021-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多