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 与可选
性能:foreach 循环中的 is_numeric() 和 is_string()
有没有一种方法可以简单地转置 SQL 中的表。此表包含 Numeric 和 Varchar 值