phpmyadmin 导出的 sql 文件无法直接在 postgresql 中执行,因其语法、数据类型、函数及权限模型与 postgresql 全不兼容,必须通过 pgloader 或手动转换实现迁移。
直接说结论:phpmyadmin 导出的 sql 文件无法直接在 postgresql 中执行,不是“调个编码就能用”的事,本质是语法、类型、函数、权限模型全都不兼容。
phpMyAdmin 导出的 SQL 是 MySQL 专用方言
你点“导出 → 格式选 SQL → 执行”,得到的文件里满是 ENGINE=InnoDB、AUTO_INCREMENT、TINYINT(1)、DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 这类语句——PostgreSQL 全不认识。它不支持 ENGINE,没有 AUTO_INCREMENT(用 SERIAL 或 IDENTITY),TINYINT 会报错,时间戳默认行为也不同。
常见错误现象包括:
ERROR: syntax error at or near "ENGINE"ERROR: type "tinyint" does not exist-
ERROR: column "created_at" is of type timestamp without time zone but expression is of type text(因 MySQL 的字符串时间字面量被直译)
想迁移到 PostgreSQL,必须跳过 phpMyAdmin 导出环节
别在 phpMyAdmin 里折腾“导出为兼容格式”——它根本没有这个选项,所有“SQL 导出”都锁定为 MySQL 语法。
真正可行的路径只有两条:
- 用
mysqldump --no-create-info --skip-extended-insert只导出干净的INSERT数据,再配合脚本逐行转成 PostgreSQL 的INSERT(注意 NULL、引号、转义、日期格式) - 用专业迁移工具,比如
pgloader:它能连上 MySQL 实例,自动映射类型、重写 DDL、处理数据转换,命令形如pgloader mysql://user@localhost/mydb postgresql:///mydb_pg
如果表结构简单、数据量小,也可以手动重写建表语句:CREATE TABLE 每一行都查 PostgreSQL 官方文档对应类型(比如 VARCHAR(255) 可保留,但 TEXT 更推荐;DATETIME 改成 TIMESTAMP WITHOUT TIME ZONE)。
中文和 emoji 能否保留?关键不在 phpMyAdmin,而在连接层
即使你绕过语法问题,乱码仍会发生——根源是 MySQL 连接字符集没设对,导致导出时字段值就被截断或转义错。
确保这三点才可能保住中文/emoji:
- 导出前在 phpMyAdmin 的 SQL 窗口手动执行:
SET NAMES utf8mb4 - 导出页顶部显示的“当前连接字符集”必须是
utf8mb4(不是utf8) - 导出设置里勾选「UTF-8 编码」(这个控制 SQL 文件内字符串字面量的编码,不是连接层)
但请注意:这些只保得住“导出文件里的中文看起来正常”,导入到 PostgreSQL 前你还得确认目标库的 client_encoding 是 UTF8,且表字段定义用了 TEXT 或 VARCHAR(PostgreSQL 原生支持 UTF-8,不需额外配置 collation)。
最常被忽略的一点:phpMyAdmin 导出的视图、存储过程、触发器,哪怕你勾了“包含”,生成的也是 MySQL 语法,PostgreSQL 一个都执行不了——这类逻辑必须重写,没有自动转换方案。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











