SQLite 中的 NUMERIC 和 INTEGER 类型是不是完全相同?

Posted

技术标签:

【中文标题】SQLite 中的 NUMERIC 和 INTEGER 类型是不是完全相同?【英文标题】:Is NUMERIC and INTEGER types are exaxtly same in SQLite?SQLite 中的 NUMERIC 和 INTEGER 类型是否完全相同? 【发布时间】:2020-03-25 13:39:09 【问题描述】:

SQLite 数据库中的 Numeric 和 Integer 类型是否完全相同?

我对这些类型有些困惑。如果有任何区别,那么有什么区别?

【问题讨论】:

【参考方案1】:

NUMERIC 不是一个类型(AKA 存储类),它是一个亲和INTEGER 两者兼有。

来自the documentation(已添加重点):

具有 NUMERIC 关联的列可能包含使用所有五个存储类的值。将文本数据插入 NUMERIC 列时,如果文本分别是格式良好的整数或实数文字,则文本的存储类将转换为 INTEGER 或 REAL(按优先顺序)。如果 TEXT 值是格式正确的整数文字,它太大而无法放入 64 位有符号整数,则将其转换为 REAL。对于 TEXT 和 REAL 存储类之间的转换,仅保留数字的前 15 位有效十进制数字。如果 TEXT 值不是格式正确的整数或实数,则该值存储为 TEXT。就本段而言,十六进制整数文字不被视为格式正确,而是存储为 TEXT。 (这样做是为了与版本 3.8.6 2014-08-15 之前的 SQLite 版本保持历史兼容性,其中首次将十六进制整数文字引入 SQLite。)不会尝试转换 NULL 或 BLOB 值。

字符串可能看起来像带有小数点和/或指数表示法的浮点文字,但只要该值可以表示为整数,NUMERIC 关联就会将其转换为整数。因此,字符串 '3.0e+5' 存储在具有 NUMERIC 亲和性的列中作为整数 300000,而不是作为浮点值 300000.0。

使用 INTEGER 亲和性的列的行为与使用 NUMERIC 亲和性的列相同。 INTEGER 和 NUMERIC 亲和力之间的差异仅在 CAST 表达式中很明显。

(阅读和理解整个页面及其描述的概念,如亲和力,对于了解 sqlite 的工作原理至关重要。)

CAST() 的规则过于复杂,无法完整引用,但可以阅读here。总而言之,转换为INTEGER 将始终返回一个整数,转换为NUMERIC 可以返回一个整数或实数值,具体取决于。

【讨论】:

以上是关于SQLite 中的 NUMERIC 和 INTEGER 类型是不是完全相同?的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy 选择在 SQLite 表上给出不同的结果,原始 sql 与可选

如何将 Python 十进制转换为 SQLite 数字?

性能:foreach 循环中的 is_numeric() 和 is_string()

有没有一种方法可以简单地转置 SQL 中的表。此表包含 Numeric 和 Varchar 值

如何找到表中的所有 NUMERIC 列并对它们执行 SUM() ?

如何在Linux下用C/C++语言操作数据库sqlite3