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

Laravel 5.6.17搭配PHP7.2执行php artisan migrate报错求助

问题解决:Laravel 5.6 + PHP7.2 迁移报错1071

嘿,我来帮你搞定这两个问题!先看你的报错信息:

Migration table created successfully. Illuminate\Database\QueryException : SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter ...)

1. Laravel 5.6 是否支持PHP7.2?

当然支持!Laravel 5.6的官方要求是PHP版本不低于7.1.3,PHP7.2完全在兼容范围内,所以版本不是导致报错的原因,问题出在数据库索引长度的限制上。

2. 解决「1071 Specified key was too long」报错

这个错误的根源是:MySQL默认的InnoDB引擎对单列索引的最大长度限制是767字节,而Laravel 5.6及以上版本默认使用utf8mb4字符集(支持存储emoji表情),每个字符占4字节。如果你的迁移文件里有长度为255的字符串字段并设置了索引,255*4=1020字节就会超过767的限制,从而触发报错。

给你两种解决方法,推荐第一种:

方法一:在AppServiceProvider中设置默认字符串长度(无需服务器权限)

打开app/Providers/AppServiceProvider.php,先引入Schema类,然后在boot方法里添加一行代码,统一设置字符串字段的默认长度为191(191*4=764,刚好低于767的限制):

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Schema; // 引入Schema类
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Schema::defaultStringLength(191); // 添加这一行
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        // 原有代码保持不变
    }
}

保存后,重新执行php artisan migrate就能正常运行了。

方法二:修改MySQL配置(需要服务器权限)

如果你有权限修改MySQL的配置文件(Linux是my.cnf,Windows是my.ini),可以添加以下配置来支持更长的索引:

[mysqld]
innodb_file_format=Barracuda
innodb_file_per_table=ON
innodb_large_prefix=ON

修改后重启MySQL服务,再执行迁移命令即可。

内容的提问来源于stack exchange,提问作者Fatema Tuz Zuhora

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:56:29