phpMyAdmin不支持跨库表结构对比,需用mysqldump --no-data导出SQL后diff比对,或在Laravel中借助doctrine/dbal动态校验,注意Laravel 11+新增expires_at字段及softDeletesTz()类型变化等版本级差异。
phpMyAdmin 本身不支持跨库表结构对比
你打开 phpmyadmin,点遍所有菜单都找不到“对比两个数据库的表结构”功能——这不是你漏看了,是它真没有。phpmyadmin 是个 sql 执行前端,不是数据库 schema 管理工具。laravel 11 和 12 的差异体现在迁移文件、字段类型映射、索引策略甚至软删除字段(如 expires_at 在 laravel 11+ session 表中新增)上,这些无法靠 phpmyadmin 的“结构”标签页肉眼比对清楚。
用 mysqldump + diff 做轻量级结构快照比对
最直接、可复现、不依赖 PHP 环境的方式:分别导出两个环境(Laravel 11 库 vs Laravel 12 库)的纯结构 SQL,再用命令行比对。适用于验证迁移是否真正落地、或排查部署后表结构不一致问题。
mysqldump -u root -p --no-data --skip-triggers --skip-routines laravel11_db > schema_11.sqlmysqldump -u root -p --no-data --skip-triggers --skip-routines laravel12_db > schema_12.sql- 然后执行:
diff schema_11.sql schema_12.sql | head -n 30查看前 30 行差异
注意:Laravel 12 默认启用 expires_at 字段(尤其在 session 表),而 Laravel 11 不会自动加;softDeletesTz() 生成的 deleted_at 类型也从 DATETIME 变为 TIMESTAMP(带时区),这些都会在 CREATE TABLE 语句里体现为字段定义差异。
在 Laravel 内部做结构校验需靠 doctrine/dbal
如果你必须在 PHP 层动态比对(比如 CI 流水线中验证测试库是否与迁移一致),得引入 doctrine/dbal。Laravel 自身的 Schema facade 不提供差异计算能力,底层依赖的正是 DBAL 的 Comparator。
- 安装:
composer require doctrine/dbal - 写个 Artisan 命令或 Tinker 脚本,用
Doctrine\DBAL\Schema\Comparator比较两个连接的Schema对象 - 关键限制:DBAL 对 MySQL 8.0+ 的 JSON 字段、Generated Columns 支持有限;Laravel 12 的新字段类型(如
timestampTz())可能被识别为普通TIMESTAMP,导致误报
别指望 php artisan schema:dump——它只生成 PHP 快照(database/schema/mysql.php),不是 SQL,也不能反向比对。
容易忽略的 Laravel 版本级结构陷阱
真正导致“结构看似一样但行为异常”的点,往往藏在字段定义之外:
- Laravel 11 起,
session表 migration 默认包含$table->timestamp('expires_at')->nullable();,旧版没这字段,硬套用会导致SessionHandlerInterface::read()报错 -
softDeletesTz()在 Laravel 12 中强制使用TIMESTAMP类型并设useCurrentOnUpdate,而你若在 phpMyAdmin 里手动把deleted_at改成DATETIME,Laravel 会静默忽略更新 - 外键约束名:Laravel 10–12 自动生成的约束名格式变了(如
users_email_foreign→users_email_fkey),虽不影响运行,但在用mysqldump --skip-extended-insert还原时可能因约束名冲突失败
比对结构只是第一步;确认字段类型、NULL 性、默认值、索引覆盖、外键动作(ON DELETE CASCADE 是否保留)以及 Laravel 迁移是否真正执行过(查 migrations 表记录),缺一不可。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











