【问题标题】:How do I import a file of SQL commands to PostgreSQL?如何将 SQL 命令文件导入 PostgreSQL?
【发布时间】:2015-08-20 18:48:40
【问题描述】:

我在 Windows 8.1 上从 PostgreSQL 9.4 运行此命令:

psql -d dbname -f filenameincurrentdirectory.sql

该 sql 文件具有例如以下命令:

INSERT INTO general_lookups ("name", "old_id") VALUES ('Open',  1);
INSERT INTO general_lookups ("name", "old_id") VALUES ('Closed', 2);`

当我运行 psql 命令时,我收到以下错误消息:

psql:filenameincurrentdirectory.sql:1: ERROR:  syntax error at or near "ÿ_I0811a2h1"
LINE 1: ÿ_I0811a2h1 ru

如何使用 psql 导入 SQL 命令文件? 我在执行这些 sql 文件时使用 pgAdmin 没有问题。

【问题讨论】:

标签: windows postgresql psql byte-order-mark


【解决方案1】:

如果您的问题是 BOM,字节顺序标记,另一个选项是 sed。也很好,因为如果 BOM 不是您的问题,它对您的数据是非破坏性的。下载并安装 sed for windows:

http://gnuwin32.sourceforge.net/packages/sed.htm

名为“Complete package, except sources”的包包含“Binaries”包没有的其他必需库。

安装 sed 后,运行以下命令从文件中删除 BOM:

sed -i '1 s/^\xef\xbb\xbf//' filenameincurrentdirectory.sql

如果您的文件对于 Notepad++ 来说太大,则特别有用

【讨论】:

    【解决方案2】:

    好的,问题确实与 BOM(字节顺序标记)有关。该文件由 Microsoft Access 生成。我在记事本中打开文件并将其保存为 UTF-8 而不是 Unicode,因为 Windows 默认保存 UTF-16。收到此错误消息: psql:filenameincurrentdirectory.sql:1: ERROR: syntax error at or near "INSERT" LINE 1: INSERT INTO general_lookups ("name", "old_id" ) VAL...

    然后我从另一个website 那里得知,Postgres 不使用 BOM,并且记事本不允许用户在没有 BOM 的情况下进行保存。所以我不得不下载Notepad++,将编码设置为UTF-8,不带BOM,保存文件,然后导入。瞧!

    使用 Notepad++ 的替代方法是我编写的这个小 Python 脚本。只需传入要转换的文件名即可。

    import sys
    
    if len(sys.argv) == 2:
        with open(sys.argv[1], 'rb') as source_file:
            contents = source_file.read()
    
        with open(sys.argv[1], 'wb') as dest_file:
            dest_file.write(contents.decode('utf-16').encode('utf-8'))
    else:
        print "Please pass in a single file name to convert."
    

    【讨论】:

    • 不使用 BOM 吗?对于 8 位编码,BOM 没有意义,因为只有一个字节顺序。
    • 这与我刚刚添加到评论中的 URL 的论点相同。它使 PostgreSQL 使用的 sql 文件无法使用记事本。
    • 在 unix 平台上删除它的最简单方法是:dd if=myinputfile of=myoutputfile bs=1 skip=3(也可以通过管道传输,避免创建中间输出文件)
    • 记事本不可能用于任何事情,不仅仅是 SQL 文件 ;) (SCNR)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    相关资源
    最近更新 更多