TypeORM在不同操作系统下生成UUID主键的字段类型差异问题
问题原因
- 该差异并非操作系统兼容性直接导致,核心是两个环境中的TypeORM版本、MySQL驱动版本或MySQL服务端版本不一致触发的映射规则差异:早期TypeORM版本对MySQL的
uuid类型主键默认映射为varchar(36),后续部分迭代版本调整为默认映射char(36)(UUID长度固定,char类型性能更优),两个环境的依赖版本不一致就会出现该差异。 - 补充:你的代码存在类型声明错误,UUID生成值为字符串,当前将id字段声明为
number类型本身不匹配,后续业务调用也会存在隐患,建议先修正为string类型。
解决方法
直接在字段装饰器中显式指定字段类型,强制覆盖默认映射规则,无论环境版本如何都会生成你指定的统一类型:
- 如果要统一使用
varchar(36),修改代码为:
@PrimaryGeneratedColumn('uuid', { type: 'varchar', length: 36 }) public readonly id!: string;
- 如果要统一使用
char(36),修改代码为:
@PrimaryGeneratedColumn('uuid', { type: 'char', length: 36 }) public readonly id!: string;
- 显式指定类型后,TypeORM的表同步逻辑不会再识别到字段类型差异,不会触发自动删除字段的报错。
- 如果当前已经存在存量数据,先手动将现有表的id字段类型调整为你要统一的类型,再部署修改后的代码,避免同步逻辑执行报错。
- 生产环境建议关闭
synchronize: true配置,改用TypeORM迁移脚本(Migration)管理表结构变更,避免自动同步误删业务数据。
内容的提问来源于stack exchange,提问作者Richard Diaz
相关产品推荐
相关产品推荐

