首页 > 解决方案 > 使用 BIGINT 时 Sqlite 整数溢出

问题描述

有一个 sqlite3 我想查询和总结不同的值。我想要做的查询是:

SUM(CAST(amountA AS BIGINT)) as totalA, SUM(CAST(amountB AS BIGINT)) as totalB

当查询找到多个结果时,它将触发:

error="integer overflow"

查看 sqlite 的文档,似乎没有这样的 BIGINT,但是由于亲和力,BIGINT 被视为 INTEGER。

是否可以使用 sqlite3 对 BIGINT 数字求和?

编辑

amountA和的数据类型amountB是TEXT。将其更改为 INTEGER 将在执行以下操作时触发相同的错误:

SUM(amountA) as totalA, SUM(amountB) as totalB

这是因为我存储的值是1000000000000000000,当存储 10 个类似的值时,当对它们求和时,它会溢出,因为它会溢出一个 8 字节的有符号整数

标签: sqlsqlitebigint

解决方案


您应该将整数值存储为INTEGER和 not TEXT,但对于您的问题,它不会有任何区别。

当使用聚合函数时,SUM()任何看起来是整数的字符串值都会隐式转换为整数,如果所有求和值都是整数,那么结果数据类型也是INTEGER.
您的数据总和似乎超过了 SQLite 支持的最大 64 位整数值9223372036854775807,您得到integer overflow.

您可以做的是通过将每个值转换为 将数字相加为实数REAL

SUM(CAST(amountA AS REAL)) as totalA, SUM(CAST(amountB AS REAL)) as totalB

或者使用 SQLite 的TOTAL()聚合函数,它将数字相加REAL并且永远不会引发整数溢出:

TOTAL(amountA) as totalA, TOTAL(amountB) as totalB

SUM()您可以在此处阅读更多信息TOTAL()内置聚合函数


推荐阅读