根本原因是mysql服务端默认存储引擎为myisam且字符集配置不匹配,须在my.cnf中设default-storage-engine=innodb、character-set-server=utf8mb4,并在laravel迁移闭包内显式设置$table->engine='innodb'、$table->charset='utf8mb4'、$table->collation='utf8mb4_unicode_ci'。

新 Laravel 项目执行迁移后表仍用 MyISAM 引擎,导致外键失效、全文索引不可靠、事务不支持,根本原因是 MySQL 服务端默认存储引擎未被覆盖,且字符集配置与引擎要求不匹配。
确认当前 MySQL 默认引擎和字符集
连接 MySQL 终端,执行:SHOW VARIABLES LIKE 'default_storage_engine'; 和 SHOW VARIABLES LIKE 'character_set_server';。若返回 MyISAM 或 latin1,就说明底层配置已锁定,Laravel 迁移中写的 $table->engine = 'InnoDB' 会被忽略。
这一步必须做,否则后续所有迁移配置都只是表面功夫。
在 Laravel 迁移中强制指定 InnoDB 与 UTF8MB4
编辑迁移文件,在 up() 方法内 Schema::create 回调中添加两行:
$table->engine = 'InnoDB';
$table->charset = 'utf8mb4'; $table->collation = 'utf8mb4_unicode_ci';
注意:这两行必须写在 Schema::create() 的闭包里,不能放在外面;【charset 和 collation 必须同时设置,只设 charset 不生效】。
如果使用 Schema::table() 修改已有表,需额外加 DB::statement("ALTER TABLE `{$table}` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB");,因为 table() 不支持直接设 engine 和 charset。
修改 MySQL 配置文件永久生效
找到 MySQL 配置文件(Linux 多为 /etc/my.cnf 或 /etc/mysql/my.cnf,Windows 为 my.ini),在 [mysqld] 段落下添加:
default-storage-engine = InnoDB
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
重启 MySQL 服务:sudo systemctl restart mysql(或 service mysqld restart)。
重启后务必重新执行 SHOW VARIABLES 验证,否则迁移仍会回落到 MyISAM。
验证迁移结果是否真正落地
运行 php artisan migrate 后,立即执行:
① 进入 MySQL:DESCRIBE your_table_name; → 看 Engine 列是否为 InnoDB;
② 执行:SHOW CREATE TABLE your_table_name; → 检查建表语句末尾是否有 ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
③ 若任一检查失败,说明配置未生效,需回溯前三个步骤,重点排查 MySQL 配置文件路径是否正确、是否被多个配置文件覆盖、MySQL 是否真正读取了该配置段。











