phpmyadmin 无法直接完成 mariadb 到 mysql 的迁移,仅能导出含 mariadb 特有语法的 sql 脚本,需人工或脚本清洗后才能在 mysql 中执行。
直接在 phpmyadmin 里无法完成 mariadb → mysql 的“迁移”——它不是点击几下就能切换的数据库引擎切换操作,而是涉及兼容性检查、逻辑导出/导入、潜在语法与行为差异处理的完整数据迁移流程。
phpMyAdmin 只能导出 SQL,不能自动适配 MySQL
phpMyAdmin 的「导出」功能生成的是 SQL 脚本(mysqldump 格式),但它默认按当前数据库(MariaDB)的实际行为生成,比如:
- 可能包含
MariaDB-only 的语法,如SEQUENCE、CONNECT引擎、ARIA表引擎声明 - 使用
utf8mb4_0900_as_cs这类 MySQL 8.0+ 才支持的排序规则,而 MariaDB 用的是utf8mb4_unicode_ci - 导出的
CREATE TABLE中带ENGINE=Aria或ENGINE=MyISAM,而目标 MySQL 实例若禁用这些引擎会报错
所以你从 phpMyAdmin 导出后,必须人工或脚本清洗 SQL 文件,否则 mysql -u root -p 很可能失败。
必须先确认 MariaDB 表是否全为 InnoDB
MySQL 8.0 默认不启用 MyISAM 和 Aria,且生产环境强烈建议只用 InnoDB。迁移前务必在 MariaDB 中执行:
SELECT TABLE_SCHEMA, TABLE_NAME, ENGINE
FROM information_schema.TABLES
WHERE TABLE_SCHEMA NOT IN ('mysql','information_schema','performance_schema','sys')
AND ENGINE NOT IN ('InnoDB');
如果返回非空结果,说明存在不兼容表,需先转换:
ALTER TABLE mydb.mytable ENGINE=InnoDB;- 注意:大表执行时会锁表,建议在低峰期操作
- 转换后再次运行上面的
SELECT确认结果为空
Laravel 迁移文件本身不依赖 MariaDB/MySQL 差异,但 runtime 配置要调
Laravel 的 database/migrations/*.php 是 PHP 代码,靠 Schema::create() 等构建器生成语句,本身不写死引擎或排序规则。但有两个关键点必须手动干预:
- 如果你的 Laravel 项目曾为适配旧版 MariaDB(AppServiceProvider::boot() 中写了
Schema::defaultStringLength(191),迁移到 MySQL 5.7.7+ 或 8.0 后可安全删掉——否则索引长度被人为限制,浪费空间 -
.env中的DB_PORT很可能需要改:MAMP 默认 MySQL 端口是8889,WAMP 是3306,原生 MySQL 安装通常是3306;MariaDB 默认也是3306,但共存时可能被占,得用netstat -an | grep :3306确认 - 迁移前务必运行
php artisan config:clear,否则缓存的旧配置可能导致php artisan migrate连错库
真正可行的迁移路径只有三步:导出 → 清洗 → 导入 + Laravel 重跑
不要试图在 phpMyAdmin 界面里“选中数据库 → 右键迁移”。正确做法是:
- 在 MariaDB 服务器上用命令行导出(更可控):
mysqldump --no-tablespaces --skip-triggers --routines --databases myapp_db > myapp_dump.sql - 用
sed或 VS Code 替换掉不兼容内容:把ENGINE=Aria换成ENGINE=InnoDB,删掉/*!50100 PARTITION BY ... */这类 MariaDB 分区扩展 - 在目标 MySQL 中建空库:
CREATE DATABASE myapp_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;,再导入:mysql -u root -p myapp_db - 最后才轮到 Laravel:
php artisan migrate:reset && php artisan migrate—— 因为迁移文件描述的是「期望结构」,不是历史快照,重跑才能确保字段类型、索引、时间戳行为完全对齐 Laravel 的 schema 构建器逻辑
最常被跳过的环节是「清洗 SQL」和「重跑 migrate」。很多人以为 dump/import 完就结束了,结果发现 created_at 默认值不对、json 字段报错、或者唯一索引失效——那基本都是没让 Laravel 用自己的方式重建表结构导致的。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











