根本原因是MySQL utf8mb4下VARCHAR(255)索引超767字节限制;解法是在AppServiceProvider的boot()中添加Schema::defaultStringLength(191),再清缓存重试。

SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long 错误
这是 laravel-admin 安装时最常卡住的地方,本质不是 laravel-admin 的问题,而是 MySQL 5.6/5.7 默认 utf8mb4 字符集下索引长度超限。执行 php artisan admin:install 时建表失败,报错指向 users_email_unique 或类似唯一索引。
- MySQL 5.7.7+ 默认用
utf8mb4,单字符最多占 4 字节;VARCHAR(255)字段建唯一索引时,理论最大长度是255 × 4 = 1020字节,但 InnoDB 索引前缀限制为 767 字节(老版本)或 3072 字节(新版本),而 Laravel 默认没设defaultStringLength - 解决方式不是降级字符集,而是显式缩短索引字段长度:在
app/Providers/AppServiceProvider.php的boot()方法里加一行Schema::defaultStringLength(191) - 必须在
use Illuminate\Support\Facades\Schema;已引入的前提下添加,否则会报Class 'Schema' not found - 加完后清缓存再重试:
php artisan config:clear→php artisan cache:clear→php artisan admin:install
执行 admin:install 前数据库连接已报错
如果还没走到建表那步,php artisan admin:install 就直接抛出数据库连接异常,比如 SQLSTATE[HY000] [1045] Access denied for user,说明框架连数据库都进不去,别急着调 laravel-admin 配置。
- 先确认
.env里DB_CONNECTION、DB_HOST、DB_PORT、DB_DATABASE、DB_USERNAME、DB_PASSWORD全部填对,且没有多余空格或中文标点 -
DB_HOST别写localhost,统一用127.0.0.1,尤其在 Docker 或某些 Linux 环境下localhost会走 socket 连接,容易失败 - 运行
php artisan tinker,输入DB::connection()->getPdo();看是否能拿到 PDO 实例;如果报错,就不是 laravel-admin 的事,是基础环境没通 - 检查 MySQL 用户是否有对应数据库的
CREATE权限——admin:install要建 5 张表,只读权限不够
config/admin.php 里改了表名但安装仍失败
有人在 config/admin.php 中把 'database' => ['users_table' => 'my_users'] 改了,以为能跳过默认表冲突,结果还是报错。其实 admin:install 命令压根不读这个配置——它只按内置迁移文件建表,和后台运行时用的表名是两套逻辑。
-
admin:install固定创建admin_users、admin_role_users、admin_permissions、admin_menu、admin_operation_log这 5 张表,不会因为配置改了就绕开 - 想换表名?只能手动改 vendor 里的迁移文件(不推荐),或者安装完再用 SQL 重命名,然后同步更新
config/admin.php和模型类中的$table属性 - 更稳妥的做法:先用默认表名完成安装,验证后台能登录、菜单能加载,再考虑定制化改造
安装中途断电或 Ctrl+C 导致 migration 状态混乱
一旦 admin:install 没跑完就中断,Laravel 的 migrations 表里可能只记了部分执行记录,再跑会提示 “Table already exists” 或 “Migration already indexed”,但实际表不全。
- 别直接删库重来,先查
migrations表:SELECT * FROM migrations WHERE migration LIKE '%admin%'; - 手动删掉那些状态为 “已记录但表不存在” 的记录(比如只有
2016_01_04_173148_create_admin_tables记录,但admin_users表没建出来) - 删完再执行
php artisan migrate:refresh --path=vendor/encore/laravel-admin/src/database/migrations,强制重放 laravel-admin 的迁移 - 如果提示路径不存在,说明 vendor 没正确发布,先补跑:
php artisan vendor:publish --provider="Encore\Admin\AdminServiceProvider" --force
关键点在于:laravel-admin 的安装命令本身不校验数据库兼容性,也不做兜底回滚。所有前置条件(字符集、连接、权限、磁盘空间)都得人工确认到位,它才肯往下走。


















