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_DATESQL模式,禁止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: stringdateTime2都补充了合法值之后,再改回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
相关产品推荐
相关产品推荐

