点燃版本: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的行为在这些规则中也是允许的。
有两种方法可以获取正确的类型或避免处理错误的类型。
- 尽管
BIGINT
类型派生自元信息,但在读取数据时,数据类型仍然DECIMAL
。 - 将所有
BIGINT
类型视为DECIMAL
类型。