如何将MySQL数据库转储文件转换为PostgreSQL?解决编码恢复错误
解决MySQL cp1251编码转储文件恢复到PostgreSQL的编码错误问题
这个问题我之前帮朋友处理过,核心是cp1251编码的MySQL转储文件和PostgreSQL默认的UTF8编码不兼容,再加上两种数据库的SQL语法差异,直接导入肯定会报错。给你几个靠谱的解决办法,按推荐程度排序:
方法一:编码转换+专业迁移工具(最推荐)
先把文件编码转成UTF8,再用专门的工具处理MySQL到PostgreSQL的语法差异,一步到位。
转编码为UTF8
- 在Linux/macOS或Git Bash里用
iconv命令:iconv -f cp1251 -t utf-8 dump.sql > dump_utf8.sql - Windows下如果没有iconv,也可以用Notepad++:打开dump.sql,点击顶部菜单栏「编码」→「转为UTF-8」,然后保存为新文件。
- 在Linux/macOS或Git Bash里用
用pgloader处理语法转换+导入
pgloader是专门做数据库迁移的工具,能自动处理大部分MySQL和PostgreSQL的语法差异(比如AUTO_INCREMENT转SERIAL、函数名适配、类型转换等),还能直接加载转码后的SQL文件:pgloader dump_utf8.sql pgsql://your_pg_user:your_pg_pass@localhost/your_target_db如果还能直接连接到源MySQL数据库,更简单:
pgloader mysql://your_mysql_user:your_mysql_pass@localhost/your_mysql_db pgsql://your_pg_user:your_pg_pass@localhost/your_target_db它会自动处理编码和语法,比手动改省心太多。
方法二:重新导出MySQL数据为PostgreSQL兼容格式
如果还能访问源MySQL数据库,直接导出时就指定兼容PostgreSQL的格式和UTF8编码,省掉后续转码步骤:
mysqldump --compatible=postgresql --default-character-set=utf8 -u your_mysql_user -p your_mysql_db > dump_compatible.sql
然后直接用psql your_target_db < dump_compatible.sql导入就行,不过这个选项只能处理基础语法,复杂对象(比如触发器、存储过程)可能还是需要手动调整。
方法三:临时创建cp1251编码的PostgreSQL数据库中转
如果不想用工具,也可以先在PostgreSQL里建一个cp1251编码的临时库,导入后再转成UTF8:
- 创建临时库(注意指定排序规则,避免乱码):
CREATE DATABASE temp_cp1251_db WITH ENCODING 'WIN1251' LC_COLLATE 'Russian_Russia.1251' LC_CTYPE 'Russian_Russia.1251' TEMPLATE template0; - 导入原dump文件:
psql temp_cp1251_db < dump.sql - 导出为UTF8编码的SQL:
pg_dump -E UTF8 temp_cp1251_db > temp_utf8_dump.sql - 导入到目标UTF8数据库:
这个方法适合应急,但要注意如果有特殊字符,转码时可能出现小问题,建议导入后检查数据。psql your_target_db < temp_utf8_dump.sql
注意事项
- 转编码后一定要打开文件检查下特殊字符(比如俄语字符)是否显示正常,避免转错编码导致乱码。
- 复杂的存储过程、触发器、自定义函数,不管用哪种方法,大概率需要手动调整语法,因为MySQL和PostgreSQL的PL/SQL差异比较大。
- 如果用pgloader,建议先测试小表的迁移,确认没问题再全量导入。
内容的提问来源于stack exchange,提问作者evans
相关产品推荐
相关产品推荐

