根本原因是Laravel 8默认Schema长度255超出MySQL索引限制767字节,utf8mb4下255×4=1020>767导致迁移报错。

laravel-admin 在 Laravel 8 上安装不是“直接跑通就行”的事。Laravel 8 默认使用 utf8mb4 字符集 + 255 字符长度,而 MySQL 5.7+(尤其 8.0)对索引长度限制更严,php artisan admin:install 极大概率卡在迁移阶段报错:SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long。这不是配置漏了,是底层约束冲突,必须提前干预。
为什么 php artisan admin:install 会失败?
根本原因是 Laravel 8 的默认 Schema 长度(255)超出 MySQL 索引限制(767 字节),而 laravel-admin 的迁移文件里大量用到了 string('email', 255)->unique() 这类定义。MySQL 8.0 默认字符集是 utf8mb4,一个字符最多占 4 字节,255 × 4 = 1020 > 767 → 直接报错。
常见错误现象:
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long- 迁移中途停止,
admin_users、admin_menu等表没建出来 - 执行
php artisan migrate单独测试也失败
解决思路不是降级 MySQL 或改 Laravel 版本,而是统一约束出口:
- 在
app/Providers/AppServiceProvider.php的boot()方法中强制设为191 - 确保数据库连接配置明确指定字符集和排序规则
AppServiceProvider 必须加的那行代码
打开 app/Providers/AppServiceProvider.php,在 boot() 方法里添加:
use Illuminate\Support\Facades\Schema;
public function boot()
{
Schema::defaultStringLength(191);
}
注意:这行必须放在 boot() 里,不能只写在 use 区;Laravel 8 已移除 Illuminate\Support\Facades\URL 等旧 Facade 引用习惯,但 Schema 仍有效。
如果项目已启用模型自动发现或使用了 laravel/sanctum 等包,也要确认没有其他地方覆盖了该设置。最保险的做法是加完立刻运行:
php artisan config:clearphp artisan cache:clear
数据库配置要显式声明 charset 和 collation
仅改 .env 不够。Laravel 8 的 config/database.php 中 MySQL 配置块默认不带 charset 和 collation,而 laravel-admin 的迁移依赖它们生效。
在 config/database.php 的 'mysql' 数组里补全:
'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'engine' => null,
同时检查 .env 是否满足最低要求:
-
DB_HOST=127.0.0.1(别用localhost,Windows 下可能走 socket 导致认证失败) -
DB_PORT=3306(显式写出来,避免默认值干扰) -
DB_DATABASE对应库必须已存在(laravel-admin不自动创建 DB) - MySQL 用户需有
CREATE、ALTER、INDEX权限,不是只读账号
安装命令顺序不能颠倒
laravel-admin 的安装流程有强依赖关系,跳步或重试会导致状态混乱:
- 先跑
php artisan migrate测试数据库连通性和基础迁移能力 —— 成功了再继续 - 再执行
php artisan vendor:publish --provider="Encore\Admin\AdminServiceProvider"(生成config/admin.php) - 最后才是
php artisan admin:install(它内部会触发迁移 + 初始化种子)
如果中途失败,不要反复重跑 admin:install。先清理:
-
php artisan migrate:rollback(回滚到初始状态) - 删掉
database/migrations下由laravel-admin发布的迁移文件(以日期开头、含create_admin_的) - 再重新 publish + install
另外,Laravel 8 默认禁用 root 用户远程登录,若你用的是本地 MySQL 8.0,且账号是自建非 root 用户,务必确认其认证插件是 mysql_native_password,否则会报 Authentication plugin 'caching_sha2_password' cannot be loaded —— 这个错和字段长度无关,但同样拦在 admin:install 前面。


















