错误源于 MySQL 索引长度超限,非 PHP 语法问题;Laravel-admin 迁移中 utf8mb4 下 VARCHAR(255) 索引达 1020 字节,超出旧版 MySQL 767 字节限制,需在 AppServiceProvider boot() 中设 Schema::defaultStringLength(191) 并清配置缓存。

不是 PHP 语法错误,是 MySQL 的索引长度超限导致的报错,错误信息里那个 SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long 容易让人误以为是代码写错了,其实 admin:install 命令本身完全合法,问题出在数据库建表时对 email 字段加唯一索引失败。
为什么 php artisan admin:install 会触发这个错误
laravel-admin 的迁移文件默认使用 utf8mb4 字符集,而老版本 MySQL(如 5.6 或部分 MariaDB)单字段索引长度上限只有 767 字节。当字段定义为 VARCHAR(255) 且字符集为 utf8mb4 时,理论最大索引长度是 255 × 4 = 1020 字节,直接超出限制。
常见触发场景:
- 本地用 XAMPP/MAMP/WAMP,默认 MySQL 版本低于 5.7.7
- Docker 环境中镜像基于旧版 MySQL 或 MariaDB
- 服务器上未手动升级 MySQL,仍用系统包管理器安装的旧版
Schema::defaultStringLength(191) 必须加在 boot() 里
这个调用不是可选配置,而是强制补丁:它告诉 Laravel 所有字符串字段的默认长度从 255 改为 191,使 191 × 4 = 764 字节,刚好压线通过 767 上限。
立即学习“PHP免费学习笔记(深入)”;
注意点:
- 必须在
app/Providers/AppServiceProvider.php的boot()方法内添加,register()里无效 - 要
use Illuminate\Support\Facades\Schema;,漏掉这行会报Class 'Schema' not found - 加完后需删掉已失败的迁移记录和残留表(
migrations、users、password_resets等),否则重跑admin:install仍会卡在同一个地方
比改 defaultStringLength 更彻底的方案
如果能控制数据库环境,优先升级或调整 MySQL 配置,比改 Laravel 代码更干净:
- MySQL ≥ 5.7.7:默认支持
innodb_large_prefix = ON,无需额外操作 - 手动启用大前缀(适用于 MySQL 5.6+):在
my.cnf中加入[mysqld]<br>innodb_file_format = Barracuda<br>innodb_file_per_table = 1<br>innodb_large_prefix = 1<br>
然后重启 MySQL - 改表字符集(不推荐):把数据库/表改为
utf8而非utf8mb4,但会丢失 emoji 和部分生僻字支持
真正容易被忽略的是缓存——哪怕改了 AppServiceProvider,如果之前执行过 config:cache,Laravel 会跳过所有服务提供者的 boot() 方法,导致 defaultStringLength 根本没生效。遇到改了代码还不行,先跑一遍 php artisan config:clear 再试。



















