本质是mysql索引长度超限,核心解法为在appserviceprovider的boot方法中调用schema::defaultstringlength(191);同时需确认数据库字符集为utf8mb4、引擎为innodb row_format=dynamic,并清理配置缓存。

laravel-admin 执行 php artisan admin:install 报 SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long,本质是 MySQL 索引长度超限,不是语法错误,但表现像 SQL 报错。核心解法就一条:强制 Laravel 迁移时用更短的字符串长度建索引。
为什么 admin:install 会触发这个错误
laravel-admin 的迁移文件里对 email、username 等字段加了 unique 约束,Laravel 默认用 utf8mb4 字符集(支持 emoji),而老版本 MySQL(string(255) 且字符集是 utf8mb4 时,理论最大索引长度是 255 × 4 = 1020 字节,直接爆掉。
常见报错片段:alter table `users` add unique `users_email_unique`(`email`) —— 就卡在这一步。
- 不是你的 SQL 写错了,是 Laravel 自动生成的迁移语句在当前数据库环境下不兼容
- MySQL 版本低于 5.5.3 时,压根不支持
utf8mb4,必须升级或降级字符集(不推荐) - 即使版本够,InnoDB 表默认
ROW_FORMAT=COMPACT也会限制索引长度;DYNAMIC才能撑住utf8mb4 + 255
Schema::defaultStringLength(191) 必须配对使用
只在 AppServiceProvider::boot() 里写 Schema::defaultStringLength(191) 不够,漏掉两件事就会白配:
- 没引入
Schema类:必须在文件顶部加use Illuminate\Support\Facades\Schema;,否则报Class 'App\Providers\Schema' not found - 没清缓存:如果之前跑过失败的
migrate或admin:install,配置可能被缓存,得先执行php artisan config:clear和php artisan cache:clear - 如果已生成过 migration 表或 users 表,得手动删掉
migrations表和users表(或整个库),再重跑命令 —— 否则旧结构残留,新配置不生效
额外加固项:database.php 和表引擎
仅靠 defaultStringLength(191) 能解决 90% 场景,但遇到极顽固情况(比如某些 MariaDB 分支),还需检查 config/database.php 中 MySQL 配置:
- 确认
'charset' => 'utf8mb4'和'collation' => 'utf8mb4_unicode_ci'没被注释或改错 - 在
'mysql'配置块里显式指定引擎和行格式:'engine' => 'InnoDB ROW_FORMAT=DYNAMIC'(注意不是innodb_file_format这种已废弃项) - 如果数据库用户权限受限,确保它有
CREATE、ALTER、INDEX权限,否则报错可能伪装成语法错误
真正容易被忽略的是:这个错误从来不是孤立发生的。它往往连带暴露缓存未清、迁移残留、权限不足、甚至 config/admin.php 里数据库连接名写错(比如填了 pgsql 却连 MySQL)等问题。每次重试前,先确认 php artisan tinker 里能连上数据库,再动手。











