You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 02:20:25