Nest.js+TypeORM存Float值到MySQL被截断为整数的问题求助
问题排查与解决思路
1. 检查实体类的字段映射配置
这是最常见的触发原因:TypeORM依赖实体类的@Column装饰器配置完成与数据库字段的映射,如果实体中price字段未明确指定正确的数值类型,TypeORM可能默认将其映射为整数类型,导致存入时自动截断浮点数。
正确的实体字段定义示例:
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm'; @Entity() export class Day { @PrimaryGeneratedColumn() id: number; // 推荐用decimal类型存储金额,避免浮点精度问题,同时指定总精度和小数位 @Column({ type: 'decimal', precision: 10, scale: 2 }) price: number; // 若坚持使用float/double类型,可这样定义: // @Column({ type: 'double' }) // price: number; }
修改实体后,确保数据库结构同步:
- 开发环境若开启
synchronize: true,重启服务后TypeORM会自动更新数据库字段类型; - 生产环境需使用迁移脚本(
typeorm migration:generate)更新结构,避免数据丢失。
2. 确认数据库字段类型是否真正修改生效
即使手动修改了数据库的price字段类型,也可能存在以下问题:
- 修改操作未生效(如ALTER TABLE语句执行出错、选错表/字段);
- 实体映射与数据库字段类型不匹配(如实体仍映射为int,数据库改了double但未同步)。
直接登录数据库执行SQL,查看字段实际类型:
DESCRIBE day; -- 替换为你的实际表名
确保price字段类型为decimal(10,2)、double或float,而非int、tinyint等整数类型。
3. 排查代码中的数值截断逻辑
检查是否有中间层(DTO、管道)强制将浮点数转为整数:
- 若使用
ParseIntPipe处理请求参数,会自动截断浮点数,需替换为ParseFloatPipe或移除该管道; - 检查DTO类中
price字段的类型定义,确保是number而非integer; - 排查业务代码中是否存在手动取整逻辑(如
Math.floor()、parseInt())。
4. 查看TypeORM执行的实际SQL语句
开启TypeORM日志功能,确认插入时SQL语句中的price值是否正确:
在app.module.ts的TypeORM配置中添加logging: true:
import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { Day } from './day.entity'; @Module({ imports: [ TypeOrmModule.forRoot({ type: 'mysql', host: 'localhost', port: 3306, username: 'root', password: 'password', database: 'test', entities: [Day], synchronize: true, // 仅开发环境建议启用 logging: true, // 开启SQL日志输出 }), ], }) export class AppModule {}
启动服务后查看控制台的INSERT语句:若SQL中price值为3而非3.99,问题出在代码层;若SQL中是3.99但数据库存为3,则需重新确认数据库字段类型。
内容的提问来源于stack exchange,提问作者Sa1m0n
相关产品推荐
相关产品推荐

