phpMyAdmin不支持PostgreSQL兼容导出,仅生成MySQL语法;迁移需手动替换ENUM/SET为TEXT、删ON UPDATE、BIT→BOOLEAN、JSON默认值、auto_increment→SERIAL、清理COLLATE/COMMENT/ENGINE等,并用psql导入。

phpMyAdmin 本身不支持 PostgreSQL 兼容导出
它导出的永远是 MySQL 语法,哪怕选了 MYSQL40 兼容模式,也只解决 MySQL 跨版本问题,和 PostgreSQL 完全无关。所谓“兼容”,只是让 SQL 文件能在老 MySQL 里跑通,不是跨数据库迁移方案。
必须手动处理字段类型和默认值
PostgreSQL 对类型、约束、函数语义更严格,直接导入 MySQL 导出的 SQL 几乎必报错。常见冲突点:
-
ENUM和SET类型 → 全部替换成TEXT或VARCHAR -
TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP→ PostgreSQL 不识别ON UPDATE,得删掉整段,默认值改用CURRENT_TIMESTAMP单独写 -
BIT(1)→ 替换为BOOLEAN -
JSON列 → PostgreSQL 支持JSON,但 MySQL 的JSON_OBJECT()默认值会报错,得改成NULL或删掉默认值 -
auto_increment→ 替换为SERIAL或显式定义GENERATED ALWAYS AS IDENTITY
外键、注释、字符集要逐项清理
MySQL 的外键语法在 PostgreSQL 中虽能解析,但行为不一致;而注释、排序规则等根本无法识别:
- 删掉所有
COLLATE utf8mb4_*子句,PostgreSQL 不认这个写法 - 把
COMMENT 'xxx'移到CREATE TABLE之后,用COMMENT ON COLUMN table.col IS 'xxx';重写(否则忽略) - 外键定义里的
ON DELETE CASCADE可保留,但ON UPDATE CASCADE在 PostgreSQL 中不被支持,得删掉 - 删掉所有
/*! ... */注释块,PostgreSQL 解析器会卡住 -
ENGINE=InnoDB、ROW_FORMAT=DYNAMIC等存储引擎相关语句全部删除
别信“导出为 CSV 再转”这种捷径
CSV 只存数据,不存结构、索引、约束、默认值——你得另外手写 DDL,反而更容易漏。真要迁移到 PostgreSQL,推荐两步走:
立即学习“PHP免费学习笔记(深入)”;
- 用 phpMyAdmin 导出原始
.sql文件(选SQL格式 +另存为文件) - 用
sed或 VS Code 正则批量替换关键语法,例如:sed 's/ENUM([^)]*)/TEXT/g' dump.sql - 导入前先在 PostgreSQL 里建空库,再用
psql -d mydb -f cleaned.sql测试;报错第一行就是最该修的地方
时间戳字段最容易出 silent 错误:MySQL 导出的 NOW() 在 PostgreSQL 里不触发,结果全变成 NULL 或默认零值,这点肉眼很难发现。



















