laravel迁移报“specified key was too long”是因utf8mb4下255字符索引超767字节限制,解决方法包括:设engine为null、字段长度改191或schema::defaultstringlength(191)、升级mysql并配置barracuda+dynamic行格式。

在Laravel迁移中执行php artisan migrate时提示“Specified key was too long”,这是MySQL默认配置下索引长度超限导致的典型错误,尤其出现在使用utf8mb4字符集且字段定义过长(如string(255))的场景中。
修改数据库连接配置启用严格模式
打开config/database.php文件,找到mysql配置块,在'charset'和'collation'下方新增'engine'选项:
'engine' => null,
这一步必须做,否则后续调整字符集不会生效;Laravel 5.7+默认未设置engine,导致底层无法自动选择支持长索引的InnoDB行格式。
降低字符串字段长度或指定索引长度
方法一:在迁移文件中为字符串字段显式指定索引长度
$table->string('email', 191)->unique();
MySQL的utf8mb4每个字符最多占4字节,255×4=1020字节,超出InnoDB默认前缀索引限制767字节;191×4=764,刚好安全。
方法二:全局设置默认字符串长度(推荐用于新项目)
在AppServiceProvider的boot()方法中添加:Schema::defaultStringLength(191);
注意:该调用必须放在boot()开头,否则可能被其他服务覆盖;若已运行过迁移,需先php artisan migrate:reset再重新执行。
升级MySQL并配置服务端参数
第一步:确认MySQL版本≥5.7.7(或MariaDB≥10.2.2)
第二步:编辑MySQL配置文件(如/etc/mysql/my.cnf),在[mysqld]段落下添加:
innodb_file_format = Barracuda
innodb_file_per_table = 1
innodb_large_prefix = 1
第三步:重启MySQL服务使配置生效
第四步:修改数据库及表的行格式为DYNAMIC
ALTER DATABASE your_database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE users ROW_FORMAT=DYNAMIC;
【关键操作】必须先改库字符集再改表格式,顺序颠倒会导致ROW_FORMAT变更失败;DYNAMIC格式才能支持超过767字节的索引前缀。











