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

TypeORM搭配MySQL时重启服务器BLOB列被自动删除如何解决

问题根因

TypeORM开启自动 schema 同步(synchronize: true)时,会主动比对实体定义与数据库实际表结构的差异。默认无明确子类型的blob列定义,和MySQL元数据中返回的BLOB子类型(TINYBLOB/MEDIUMBLOB/LONGBLOB)无法匹配,TypeORM会误认为列结构发生变更,触发删除重建操作,导致原有数据丢失。

解决方案

分两种场景处理:

1. 生产环境(必做)

  • 直接关闭自动同步功能,修改TypeORM配置中的synchronize参数为false
  • 后续所有表结构变更通过TypeORM官方的迁移(Migration)功能管理,避免自动操作导致数据丢失
    配置示例:
// typeorm.config.ts
export default {
  type: 'mysql',
  host: 'localhost',
  port: 3306,
  username: 'root',
  password: 'your password',
  database: 'your db',
  entities: ['dist/**/*.entity{.ts,.js}'],
  synchronize: false, // 关闭自动同步
  migrations: ['dist/migrations/**/*{.ts,.js}'],
  migrationsRun: true // 启动时自动执行未跑过的迁移,也可手动执行命令触发
}

2. 开发环境需要保留自动同步能力

调整实体类的BLOB列定义,明确指定BLOB子类型或者对应长度,避免TypeORM的结构校验不通过:

方案A:直接指定BLOB子类型

根据存储的图片大小选择对应类型:

  • TINYBLOB:最大255字节
  • BLOB:最大65KB
  • MEDIUMBLOB:最大16MB
  • LONGBLOB:最大4GB
    调整后的实体代码:
@Entity('products_images')
export class ProductsImages extends Base {
    // 示例用MEDIUMBLOB,可根据实际存储需求更换子类型
    @Column("mediumblob", { nullable: true })
    img: Buffer;
}

方案B:指定BLOB长度

通过length属性匹配对应子类型的长度阈值即可:

@Entity('products_images')
export class ProductsImages extends Base {
    // 16777215对应MEDIUMBLOB的最大长度
    @Column({ type: "blob", length: 16777215, nullable: true })
    img: Buffer;
}

调整完配置或实体定义后重启服务,就不会再触发BLOB列的删除重建操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 03:06:02