直接结论:95%是mysql版本低+字符集不匹配导致,非代码或权限问题;需升级mysql≥5.5.3、启用utf8mb4、设schema::defaultstringlength(191)并配置innodb row_format=dynamic。

直接结论:执行 php artisan admin:install 报 SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long,95% 是 MySQL 版本低 + 字符集不匹配导致的,不是代码写错了,也不是权限问题。
为什么 MySQL 5.7.7 以下版本必报 1071 错误
laravel-admin 的迁移文件默认用 utf8mb4 字符集建索引,而 MySQL 5.7.7 以前默认最大索引长度是 1000 字节。一个 VARCHAR(255) 字段在 utf8mb4 下最多占 255 × 4 = 1020 字节,超了那 20 字节就直接炸——哪怕你只建个唯一索引(比如 users.email)也会挂。
- MySQL 5.5.3+ 才支持
utf8mb4,但默认限制仍卡在 1000 字节 - MySQL 5.7.7+ 默认启用了
innodb_large_prefix,允许索引长度达 3072 字节,才真正兼容 Laravel 默认迁移 - 查当前版本:
SELECT VERSION();;查是否支持大前缀:SHOW VARIABLES LIKE 'innodb_large_prefix';
AppServiceProvider::boot() 里加 Schema::defaultStringLength(191) 真的够用吗
够,但仅限于“先救急”。191 是 767 ÷ 4 的向下取整(InnoDB 默认页大小下,767 字节是安全上限),它让 VARCHAR 字段生成的索引控制在安全长度内。
- 必须加在
app/Providers/AppServiceProvider.php的boot()方法里,且要在use Illuminate\Support\Facades\Schema;之后 - 如果项目已存在迁移文件(比如自己手写过
create_users_table),这个设置对旧迁移无效——只影响后续新生成的迁移 - 若数据库已建好表,改完代码后要手动删掉原表再重跑
php artisan admin:install,否则字段长度不会自动收缩
config/database.php 里改 engine 参数是必须的吗
不是必须,但强烈建议加上。尤其当你用的是 MySQL 5.6 或 MariaDB 10.1 这类“半支持”版本时,InnoDB ROW_FORMAT=DYNAMIC 能绕过某些隐性限制。
- 找到
config/database.php中mysql配置块,在'engine' => null,处改为:'engine' => 'InnoDB ROW_FORMAT=DYNAMIC', - 不加这行,某些老版本 MySQL 可能仍会因行格式限制拒绝创建带长索引的表,即使你设了
defaultStringLength(191) - 注意:改完要清配置缓存:
php artisan config:clear,否则不生效
真正容易被忽略的是:这个错误常和 php artisan migrate 混淆。laravel-admin 的 admin:install 是个封装命令,它内部会先调 migrate 再做初始化。所以如果你之前手动跑过 migrate 并失败了,残留的半截表结构会让后续 install 直接卡死——别只盯着 install 报错,先 php artisan migrate:status 看迁移状态,再决定要不要 php artisan migrate:fresh。











