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

执行php artisan migrate报错:1071指定键过长问题咨询

问题原因

这个报错我之前帮好几个开发者排查过,本质是MySQL InnoDB引擎的索引长度限制和Laravel默认配置的冲突,核心原因有两个:

  • Laravel 5.4及以上版本默认使用utf8mb4字符集(支持存储emoji表情),这个字符集下每个字符最多占用4字节。如果你的users表中email字段是默认的varchar(255),计算下来总长度是255*4=1020字节,远超InnoDB默认的唯一索引最大长度767字节,直接触发了1071错误。
  • 如果你用的是MySQL 5.6及以下版本,或者MariaDB没开启innodb_large_prefix配置,引擎就不支持超过767字节的索引,这也是报错的常见诱因。
解决办法

这里给你三种实用的解决思路,按需选择:

1. 单独修改字段长度

直接在users的迁移文件里,把email字段的长度限制为191(191*4=764字节,刚好低于767的限制):

// 原代码
$table->string('email')->unique();
// 修改后
$table->string('email', 191)->unique();

改完之后重新执行php artisan migrate(如果是刚迁移报错直接重跑即可),如果已有数据需要重置表结构,可执行php artisan migrate:fresh(生产环境谨慎操作,会清空数据)。

2. 全局设置默认字符串长度

如果不想逐个修改迁移文件,可以在app/Providers/AppServiceProvider.php的boot方法里添加全局配置,让所有string类型字段默认长度为191:

use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}

配置完成后重新执行迁移命令即可生效。

3. 修改MySQL配置开启大索引支持

如果你的MySQL版本是5.6+(或MariaDB 10.0.5+),可以通过修改配置文件解除767字节的限制:
找到MySQL的配置文件(Linux系统一般是/etc/my.cnf或/etc/mysql/my.cnf,Windows系统是my.ini),在[mysqld]区块添加以下内容:

innodb_file_per_table = 1
innodb_large_prefix = 1
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

保存后重启MySQL服务,再重新执行迁移命令,就能支持更长的索引了。

内容的提问来源于stack exchange,提问作者mohsen hasani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:51:26