Laravel 9迁移表失败:仅2张表入库,报1071键过长错误
Laravel 9迁移报错:Specified key was too long; max key length is 1000 bytes
我是Laravel新手,使用最新的Laravel 9版本。database/migrations目录下有4个迁移文件,执行php artisan migrate命令后,仅users(空表)和migrations两张表成功创建,其余表无法生成,报错:
Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes
我已尝试在/app/Providers/AppServiceProvider.php中添加以下代码,但问题仍未解决:
public function boot() { Schema::defaultStringLength(191); }
请问该如何修复?
修复方案
1. 检查数据库引擎与字符集配置
这个报错核心原因是MySQL的索引长度限制:MyISAM引擎默认索引最大长度为1000字节,而utf8mb4字符集每个字符占4字节,导致默认的string字段(255长度)索引字节数(255*4=1020)超过限制。
- 打开
.env配置文件,确认数据库引擎为InnoDB(支持更大的索引长度):DB_ENGINE=InnoDB - 同时确保字符集配置正确:
DB_CHARSET=utf8mb4 DB_COLLATION=utf8mb4_unicode_ci
2. 确保AppServiceProvider配置生效
你添加的defaultStringLength代码需要引入Schema类,并且清除缓存才能生效:
- 在
AppServiceProvider.php顶部引入类:use Illuminate\Support\Facades\Schema; - 执行以下命令清除缓存:
php artisan config:clear php artisan cache:clear - 重新执行迁移(注意:
migrate:fresh会清空现有表,谨慎使用):php artisan migrate:fresh
3. 手动指定迁移字段的索引长度
如果全局配置无效,可以在具体的迁移文件中,为需要创建索引的字段指定长度,比如:
// 示例:为email字段指定191长度并设置唯一索引 $table->string('email', 191)->unique();
4. 修改MySQL全局配置(本地开发环境适用)
如果是本地开发且有权限修改MySQL配置,可以编辑my.cnf(Linux)或my.ini(Windows)文件,添加以下配置:
[mysqld] innodb_large_prefix=1 innodb_file_format=Barracuda innodb_file_per_table=1
修改后重启MySQL服务,再重新执行迁移命令。
内容的提问来源于stack exchange,提问作者sammy
相关产品推荐
相关产品推荐

