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
相关产品推荐
相关产品推荐

