我有一个由 pg_dump 在另一个 Windows 10 机器上创建的 postgresql .sql 转储文件。我正在尝试在我的 Windows 10 笔记本电脑上恢复它 “psql -U 用户 -d 数据库 -1 -f 文件名.sql”。我创建了数据库,但是当我运行命令进行恢复时,在我给它密码后,我从 psql 收到错误:
psql:filename.sql:1:1: 错误:“ÿ_”处或附近的语法错误 第 1 行:ÿ_;
该文件看起来像直的 ascii(我只在第一行看到两个破折号。我在任何地方都没有看到带有变音符号的“y”)。我用 cygwin bash 在 .sql 文件上创建了一个文件,它显示:
Little-endian UTF-16 Unicode 文本,行很长,带有 CRLF、CR 行>终止符
我真的不想手动重新创建数据库。我正在寻找任何建议。
我尝试了带或不带“-1”选项的 psql;没有运气。我尝试添加一个“;”在 sql 文件的顶部,我在某处发现了建议;再次没有运气。
我在 postgresql 安装上执行了 psql -l,所有数据库(包括我尝试恢复的数据库)上的编码都显示为 UTF8。
确实没有代码。只是我似乎无法恢复这个转储文件,因为它出错了。
我认为这解决了我的问题。我从中获取转储的 Windows 盒子现在无法使用;所以我只是希望有一种方法可以解决这个问题。我宁愿避免手动逐表重新创建数据库。
谢谢--
铝
就我而言,发生这种情况是因为我使用 Windows Powershell 进行转储,因此转储文件中包含了其他字符。 只需使用命令提示符即可解决我的问题。
我只能为您提供如何调试问题的线索,因为原因并不是立即显而易见的。
首先,靠近转储文件开头的位置应该有一行设置
client_encoding
。转储文件应该采用该编码。
我可以看到两种可能性:
文件在传输过程中被损坏。要测试这一点,请计算两个文件的校验和并进行比较。
始终使用二进制模式传输 PostgreSQL 转储。
某些编辑器或其他东西在文件的开头偷偷添加了 BOM(字节顺序标记)。
这是我的首要怀疑,因为问题出在第 1 行。
使用十六进制编辑器或
od
(在 Cygwin 中)进行验证。如果是这个问题,只需将 BOM 替换为空格即可。添加到this答案:使用PowerShell 7,pg_dump不存在此类编码问题。
尝试导入 SQL 转储文件时,您可能会遇到与字符编码相关的错误。如果转储是使用 Windows PowerShell 生成的,则经常会发生这种情况,它可能使用不同的默认字符编码。
要解决此问题,您可以使用 PowerShell 将 SQL 转储文件转换为 UTF-8 编码:
.sql
文件的目录中打开 PowerShell,然后运行以下命令。确保将 FILENAME
替换为 SQL 转储文件的名称:Get-Content -Encoding Unicode FILENAME.sql | Set-Content -Encoding UTF8 FILENAME_utf8.sql
此命令会读取 SQL 文件的内容(假设它是 Unicode 格式),然后将其写回到 UTF-8 格式的新文件中。
MYDATABASE
替换为数据库名称,将 FILENAME_utf8.sql
替换为新生成的文件的名称:psql -U postgres -d MYDATABASE -f FILENAME_utf8.sql
进行此转换的原因是 Windows PowerShell 默认情况下可能会生成 UTF-16 格式的文件,而 PostgreSQL 期望生成 UTF-8 格式的文件。上述步骤可确保您在导入之前将文件转换为预期的编码。