sql - 使用 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 字节的有符号整数
解决方案
您应该将整数值存储为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()
:内置聚合函数
推荐阅读
- amazon-web-services - 使用密钥对汇总 EC2 成本
- sql - Powershell:使用一个下拉框中的选择作为另一个下拉框中的变量
- c++ - rcpp中没有匹配的调用函数
- python - python3:lambda autoreduce 适用于最大但不是最小功能
- io - Chicken Scheme 读取行耗时过长
- python - 如何分组和总结一个标准
- xcode - google Chromium 的 Xcode 项目在哪里?
- android - Android Studio - 模拟器上的项目未显示
- apache-flink - 我想使用 Flink 的 Streaming File Sink 写入 ORC 文件,但它没有正确写入文件
- angular - then() 承诺块不等待内部等待