You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 20:15:45