Kotlin执行SQLite查询返回INT而非Decimal类型问题如何解决?
问题解决方案
核心原因
SQLite 采用动态类型系统,本身没有内置严格的Decimal/浮点类型约束,你遇到的自动转整问题是SQLite JDBC驱动的默认类型转换策略导致的:驱动会自动把值为整数的浮点/Decimal字段(比如存储值为2.0)识别为Integer类型返回,哪怕字段定义为Decimal,也会截断小数部分。
可按以下优先级尝试解决:
- 首先修改数据库连接URL,添加强制浮点返回参数,示例如下:
原来的连接串:jdbc:sqlite:/你的数据库路径.db
修改为:jdbc:sqlite:/你的数据库路径.db?force_double=true
该参数会强制驱动把所有NUMERIC、DECIMAL类型的字段都以Double类型返回,不会自动转整。 - 若修改连接串无效,可在SQL查询层面强制类型转换,比单独使用CAST更稳妥:
乘以1.0的操作会强制SQLite返回REAL类型的结果,驱动不会再做自动转整处理。SELECT Diesel * 1.0 AS Diesel, -- 其他需要查询的字段 FROM Tankstelle WHERE ((LOWER(Place) LIKE 'k%ln') OR (LOWER(Place) LIKE 'm%nchengladbach')) AND AbfrageZeitpunkt BETWEEN '2021-10-11' AND '2021-10-13' AND Distance <= 0.8 ; - 升级你使用的
sqlite-jdbc驱动版本到3.40.0及以上,老版本驱动存在已知的类型转换bug,会忽略字段类型定义统一转整。 - 终极兼容方案:读取时先取字段的字符串值再转数值类型,完全绕开驱动的自动类型转换逻辑:
val diesel = result.getString("Diesel")?.toDoubleOrNull() ?: 0.0 // 需要BigDecimal的话用以下写法 // val diesel = result.getString("Diesel")?.let { BigDecimal(it) } ?: BigDecimal.ZERO
内容的提问来源于stack exchange,提问作者Erwin109
相关产品推荐
相关产品推荐

