SQLite TEXT列存储长数字变科学计数法,如何强制存为文本?
解决SQLite中长数字存储为TEXT类型的问题
我来帮你搞定这个问题!你遇到的核心问题是SQLite的类型亲和性规则,加上JS中Number类型的精度限制导致的。下面分步骤给你解决方案:
为什么会出现科学计数法存储?
首先,你的delivery.parcelid如果是一个超出JS Number精度范围的数值(Number最大精确整数是2^53,也就是9007199254740992,你的33333333333322222222222222222222223远大于这个值),JS会自动把它近似成科学计数法的形式,哪怕你用'' +转换,得到的字符串也是"3.3333333333322223e+34",所以插入数据库后自然就是这个值。另外,即使你列定义为TEXT,SQLite的参数绑定可能会根据传入值的类型(如果是Number)自动选择数值亲和性,导致存储为数值类型。
解决方案
1. 确保delivery.parcelid是字符串类型
首先要从源头保证这个值是字符串,而不是Number:
- 如果是从API获取的,要求后端返回字符串格式的parcelid(JSON中数字类型无法精确表示这么大的整数,会自动丢失精度)。
- 如果是前端生成的,直接用字符串存储这个ID,不要转换成Number类型。
2. 插入时显式强制转换为TEXT
在SQL语句中用CAST(? AS TEXT)强制将参数转换为TEXT类型,彻底避免SQLite的类型推断问题,修改你的代码如下:
context.executeSql( "INSERT INTO deliverysimp(parcelid, expected) values(CAST(? AS TEXT), ?)", [String(delivery.parcelid), delivery.expected], // 用String()确保是字符串 function () {}, me.ErrorHandler );
这样不管传入的参数原本是什么类型,SQLite都会把它当作TEXT存储,完美解决科学计数法的问题。
验证方法
插入后可以用以下SQL查询验证存储类型:
SELECT typeof(parcelid) FROM deliverysimp WHERE parcelid = '33333333333322222222222222222222223';
如果返回text,说明已经成功以TEXT类型存储了。
内容的提问来源于stack exchange,提问作者RussAwesome
相关产品推荐
相关产品推荐

