为什么"IGNITE"计算的字段返回"BIGINT"类型?理论上,它应该是"DECIMAL"类型,因为结果包含十进制数



点燃版本:2.7.0.

以下是我使用的表达式:

SUM(A1) / SUM(A2) / 1000

A1、A2 都是整数。

在点燃中,我得到了BIGINT型。

在 MySQL 中,我得到了DECIMAL型。

MySQL的结果符合我的期望,因为数据确实包含十进制数。

如果我使用以下表达式:

SUM(A1) / SUM(A2) / 1000.0

结果是正确的。

但是为什么 Ignite 不能派生出正确的类型呢?

你的问题"但是为什么 Ignite 不能派生正确的类型?">的答案是它确实派生了正确的类型。Ignite 在对整数进行除法时明确应用了整数除法规则(就像 Java 一样),或者它应用了一条规则,该规则为整数除法生成小数位数为 0 的结果(这会产生类似的结果,尽管与整数除法相比,它可以有稍微舍入的规则)。

根据 SQL:2016 (ISO/IEC 9075-2:2016) 标准6.29<数值表达式>,这完全没问题:

否则,二元算术的两个操作数的声明类型 运算符是精确数字,结果的声明类型是 实现定义的精确数值类型,具有精度和小数位数 确定如下:

i) 设 S1 和 S2 为第一和第二操作数的刻度 分别。

ii) 加减结果的精度为 实现定义,缩放为 S1 和 S2 的最大值。

iii) 乘法结果的精度为 实现定义,规模为 S1 + S2。

iv)除法结果的精度和尺度为 实现定义

请注意,MySQL的行为在这些规则中也是允许的。

有两种方法可以获取正确的类型或避免处理错误的类型。

  1. 尽管BIGINT类型派生自元信息,但在读取数据时,数据类型仍然DECIMAL
  2. 将所有BIGINT类型视为DECIMAL类型。

相关内容

  • 没有找到相关文章

最新更新