我有一个 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没有这样的编码问题。