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

TypeORM实体新增datetime字段报ER_TRUNCATED_WRONG_VALUE错误如何解决

问题原因

该错误和实体可添加的datetime字段数量无关,本质是MySQL SQL模式限制与TypeORM字段默认配置的冲突,具体触发逻辑如下:

  • 你新增date_time2字段时,@Column未显式指定nullable或default配置,TypeORM默认字段为非空,且对datetime类型的默认填充值为'0000-00-00 00:00:00'
  • 高版本MySQL默认开启NO_ZERO_DATE SQL模式,禁止datetime字段存储零值,因此TypeORM执行新增字段、给表内已有旧数据填充默认值的SQL时触发校验报错
  • 原有datetime字段未报错是因为建表时就存在该字段,你插入数据时主动传入了合法的datetime值,未触发零值默认填充逻辑

另外你贴出的新增字段代码存在属性名重复问题:原有属性已命名为dateTime,新增字段还使用public dateTime: string会导致实体类属性冲突,需要先修改为public dateTime2: string。

解决方法

可根据业务需求选择以下任意一种方案:

  • 方案1:设置字段允许为空
    给新增字段添加nullable: true配置,新增字段时旧数据的对应字段值会设为NULL,不会触发零值错误,示例代码:
    @Index('index_date_time2')
    @Column({name: 'date_time2', type: 'datetime', nullable: true})
    public dateTime2: string
    
    若后续业务要求该字段非空,可等所有旧数据的dateTime2都补充了合法值之后,再改回nullable: false即可。
  • 方案2:设置合法默认值
    给字段指定合规的datetime默认值,比如当前时间,新增字段时旧数据会自动填充该默认值,示例代码:
    @Index('index_date_time2')
    @Column({name: 'date_time2', type: 'datetime', default: () => 'CURRENT_TIMESTAMP'})
    public dateTime2: string
    
  • 方案3:修改MySQL SQL模式(不推荐)
    若确实需要使用零值作为默认值,可修改MySQL配置移除NO_ZERO_DATE的SQL模式,该方案不符合SQL规范,后续数据库迁移容易出现兼容问题,不建议使用。

内容的提问来源于stack exchange,提问作者Kr1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 07:45:03