Laravel 5.6.17搭配PHP7.2执行php artisan migrate报错求助
嘿,我来帮你搞定这两个问题!先看你的报错信息:
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

