Laravel-admin安装失败的根因常是MySQL 8.0+默认严格模式、caching_sha2_password认证插件及utf8mb4_0900_as_cs排序规则导致迁移或连接异常,需针对性调整配置或升级版本。

laravel-admin 安装失败时,MySQL 版本不兼容是高频但容易被跳过的根因——它通常不报错在 composer require 阶段,而是在首次运行 php artisan migrate 或访问后台时暴露,比如报 SQLSTATE[42000]: Syntax error or access violation 或 Invalid default value for 'created_at'。
MySQL 8.0+ 默认 strict mode 导致 migration 失败
laravel-admin 的迁移文件(如 create_admin_users_table.php)里常含 nullableTimestamps() 或未显式指定 useCurrent() 的字段。MySQL 5.7 允许 created_at TIMESTAMP NULL DEFAULT NULL,但 MySQL 8.0+ 在严格模式下拒绝该写法,直接中断迁移。
- 临时验证:执行
SELECT @@sql_mode;,若返回含STRICT_TRANS_TABLES或STRICT_ALL_TABLES,即触发此问题 - 临时绕过(仅开发环境):在
config/database.php的mysql连接配置中添加'modes' => [],或在DB::statement("SET sql_mode = ''")前手动执行 - 长期解法:升级 laravel-admin 到 v2.2+(已适配 MySQL 8.0+ 时间戳语法),或手动修改迁移文件,将
$table->timestamps()替换为$table->timestamp('created_at')->useCurrent()->nullable(); $table->timestamp('updated_at')->useCurrentOnUpdate()->nullable();
caching_sha2_password 认证插件阻断 artisan 命令
MySQL 8.0 默认使用 caching_sha2_password 插件,而旧版 PHP PDO 或某些 Laravel 配置未启用对应驱动支持,导致 php artisan migrate 报 Authentication plugin 'caching_sha2_password' cannot be loaded。
- 检查当前 root 用户认证方式:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root'; - 降级认证(快速生效):
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; FLUSH PRIVILEGES; - 不改认证时的适配:确保 PHP 安装了
mysqlnd驱动(非mysqli),并在php.ini中确认extension=mysqli和extension=pdo_mysql已启用;Laravel.env中添加DB_SOCKET=/var/run/mysqld/mysqld.sock(Linux)或指定DB_HOST=127.0.0.1(绕过 Unix socket 认证路径)
字符集 utf8mb4_0900_as_cs 引发索引长度超限
MySQL 8.0.23+ 默认排序规则变为 utf8mb4_0900_as_cs,比旧版 utf8mb4_unicode_ci 占用更多索引空间。laravel-admin 的 admin_menu 表中 url 字段若定义为 string(191),在新排序规则下建索引会超 767 字节限制,报 Specified key was too long。
- 验证当前默认排序规则:
SHOW VARIABLES LIKE 'collation_database'; - 强制降级排序规则(推荐):在
config/database.php的mysql配置块中加入'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci' - 或全局修改 MySQL 配置(需重启):在
/etc/my.cnf中添加[mysqld] collation-server = utf8mb4_unicode_ci init-connect='SET NAMES utf8mb4' character-set-server = utf8mb4
真正卡住安装的,往往不是版本号本身,而是这些默认行为变更叠加在 Laravel 的隐式假设上。检查 php artisan tinker 能否连上数据库、DB::select('SELECT 1') 是否成功,比反复重装包更有效。


















