Node.js网站SQLite返回整数而非REAL类型问题求助
解决Node.js中SQLite REAL类型数据被转为整数的问题
刚碰到过类似的坑,结合你的描述(存入0.1查询返回0.0,TYPEOF显示real),大概率是数据插入环节的类型处理出了问题,给你几个具体的排查和解决方向:
1. 先检查表单数据的转换逻辑
表单提交的数值默认是字符串类型,如果处理时误用了parseInt()而不是parseFloat()/Number(),就会把"0.1"转成0,存入REAL列自然就是0.0了。
举个错误示例:
// 错误:parseInt会截断小数部分 const stepVariable = parseInt(req.body.step_variable); // "0.1" → 0
正确的处理方式:
// 方式1:用parseFloat解析浮点数 const stepVariable = parseFloat(req.body.step_variable); // 方式2:用Number()转换更稳妥 const stepVariable = Number(req.body.step_variable);
2. 插入时强制SQLite按REAL类型存储
即使传入了正确的浮点数,也可以在SQL语句中用CAST()强制指定类型,避免SQLite自动类型转换的意外:
const db = new sqlite3.Database('./your-db.db'); // 插入时CAST参数为REAL db.run( "INSERT INTO your_table (step_variable) VALUES (CAST(? AS REAL))", [stepVariable], // 这里确保stepVariable是浮点数类型 function(err) { if (err) console.error(err.message); } );
3. 确认SQLite驱动的类型转换配置
如果你用的是sqlite3模块,默认情况下REAL类型会映射为JavaScript的Number类型,但可以检查连接配置是否有影响数值的选项:
// 确保没有开启numericStrings等会改变类型的配置 const db = new sqlite3.Database('./your-db.db', { // 不要设置numericStrings: true,否则会把数值转成字符串 });
4. 查询时避免额外的整数转换
检查查询后的处理代码,有没有无意中把结果转成整数的操作,比如parseInt(row.step_variable),直接取值即可:
db.get( "SELECT step_variable, TYPEOF(step_variable) AS type FROM your_table WHERE id = ?", [38], function(err, row) { if (err) console.error(err.message); console.log(`实际值:${row.step_variable}`); console.log(`SQLite类型:${row.type}`); console.log(`JavaScript类型:${typeof row.step_variable}`); // 应该是number } );
按照这几步排查,基本就能解决REAL类型被转成整数的问题了。
内容的提问来源于stack exchange,提问作者Tomkimsour
相关产品推荐
相关产品推荐

