TypeORM迁移添加可空列报错,需设置utf8mb4_bin排序规则
解决TypeORM迁移中添加带指定Collation列的问题
首先,你遇到的语法错误根源很明确——SQL语句里用了HTML转义的",MySQL根本识别不了这个符号。MySQL里要包裹表名/列名的话,得用反引号`(如果你的表名/列名是关键字或含特殊字符),要是表名me不是关键字,甚至可以不用引号。
方法1:修正原生SQL语句
把转义的"替换成反引号,同时补上COLLATE utf8mb4_bin指定排序规则,明确标记可空:
await queryRunner.query('ALTER TABLE `me` ADD COLUMN `id` VARCHAR(255) COLLATE utf8mb4_bin DEFAULT NULL');
要是你的MySQL开启了ANSI_QUOTES模式,也能用双引号,但反引号是MySQL默认的转义方式,用它更稳妥。
方法2:使用TypeORM的QueryRunner API(推荐)
直接写原生SQL虽然能解决问题,但TypeORM提供了更优雅、跨数据库的API,能避免拼写错误和不同数据库的语法差异:
import { TableColumn } from "typeorm"; await queryRunner.addColumn( "me", new TableColumn({ name: "id", type: "varchar", length: "255", isNullable: true, // 明确设置可空属性 collation: "utf8mb4_bin", // 指定目标排序规则 default: null // 可选,因为isNullable=true默认就允许空值 }) );
这种方式下,TypeORM会自动根据你用的数据库生成对应SQL,不用自己处理引号和语法细节,更适合长期维护。
额外提醒
- 要确保你的
me表使用的字符集支持utf8mb4,现代MySQL版本一般默认是这个,但旧表可能需要确认一下。 - 添加列前要保证表中没有同名的
id列,不然会触发冲突报错。
内容的提问来源于stack exchange,提问作者Ahmed Ali
相关产品推荐
相关产品推荐

