使用 psql 恢复时如何修复 postgresql .sql转储文件中的语法错误?



我有一个 postgresql .sql 转储文件,由 pg_dump 在另一个 Windows 10 盒子上创建。 我正在尝试在我的 Windows 10 笔记本电脑上恢复它 "psql -U user -d database -1 -f filename.sql"。 我创建了数据库,但是当我运行命令进行还原时,在我给它密码后,我从 psql 收到错误:

psql:文件名.sql:1:1:1:错误:在"ÿ_"处或附近出现语法错误 第 1 行:ÿ_;

该文件看起来像直的ascii(我只在第一行看到两个破折号。我在任何地方都没有看到带有变音符号的"y"(。 我用cygwin bash在.sql文件上做了一个文件,上面写着:

小端 UTF-16 Unicode 文本,带有很长的行,带有 CRLF、CR 行>终止符

我真的不想手动重新创建数据库。 我正在寻找任何建议。

我尝试了带有和不带有"-1"选项的psql;没有运气。 我尝试在 sql 文件的顶部放置一个";",我发现在某处建议;又是没有运气。

我在 postgresql 安装上做了一个 psql -l,我所有数据库(包括我尝试还原的数据库(上的编码都显示 UTF8。

真的没有代码。 只是我似乎无法恢复此转储文件,因为它出错了。

我认为这抓住了我的问题。 我从中获取转储的窗口框现在不可用;所以我只是希望有一种方法可以解决这个问题。 逐个表手动重新创建数据库是我宁愿避免的事情。

谢谢--

就我而言,发生这种确切的事情是因为我使用 Windows Powershell 进行转储,因此其他字符包含在转储文件中。 只需使用命令提示符即可解决我的问题。

我只能给你如何调试问题的线索,因为原因不是很明显。

首先,应该有一行靠近转储文件开头的行,用于设置client_encoding。转储文件应采用该编码。

我可以看到两种可能性:

  • 文件在传输过程中被破坏。要对此进行测试,请计算两个文件的校验和并进行比较。

    始终使用二进制模式来传输 PostgreSQL 转储。

  • 一些编辑器或其他东西在一开始就将 BOM(字节顺序标记(潜入文件中。

    这是我的主要嫌疑人,因为问题出在第 1 行。

    使用十六进制编辑器或od(在Cygwin中(来验证这一点。如果这是问题所在,只需将 BOM 表替换为空格即可。

补充一下这个答案:使用PowerShell 7,pg_dump没有这样的编码问题。

最新更新