【问题标题】:Postgres COPY command running manually but not through JAVAPostgres COPY 命令手动运行但不通过 JAVA
【发布时间】:2017-07-03 17:24:47
【问题描述】:

我正在通过 JAVA 程序生成器运行此命令

plpgsql = "\"path_to_psql_executable\psql.exe" -U myuser -w -h myhost -d mydb -a -f "some_path\copy_7133.sql" 2> "log_path\plsql_7133.log\"";

ProcessBuilder pb = new ProcessBuilder("C:\\Windows\\System32\\cmd.exe", "/c", plpgsql);
Process p = pb.start();
p.getOutputStream().close();
p.waitFor();

这将返回以下错误:

错误:编码“UTF8”的字节序列无效:0xbd CONTEXT:COPY copy_7133,第 4892 行

问题是,如果我在 cmd 中手动运行 SQL 命令,那么它会成功复制所有数据,从而为我提供插入的行数。无法弄清楚原因

注意:该代码仅对一个特定文件造成问题,其余工作正常。

编辑: 正在运行的复制命令:

\copy s_m_asset_7140 FROM 'C:\ER\ETL\Unzip_7140\asset.csv' csv HEADER QUOTE '"' ENCODING 'UTF8';

命令给出的最后一个错误:

psql:C:/ER/ETL/Unzip_7140/copy_s_m_asset_7140.sql:1:错误:无效 编码“UTF8”的字节序列:0xa0 CONTEXT:COPY s_m_asset_7140, 第 10282 行

但是除了“-”之外似乎没有任何特殊字符。不确定它无法读取的内容。

关于 DB 的更多细节: 显示客户端编码; “统一码”

显示服务器编码; “UTF8”

【问题讨论】:

  • 为什么要使用ProcessBuilder 来运行复制命令? copy是SQL语句,也可以直接通过JDBC运行。
  • 错误消息表明 psql 需要一个 UTF-8 编码文件,但您的输入文件不是。更改 SQL 脚本中的 client_encoding 以匹配输入文件或更改输入文件的编码。
  • @a_horse_with_no_name:我的文件是 UTF-8 编码的 .csv 文件。我关心的是如果有任何编码问题,那为什么同样的命令手动运行成功?

标签: java postgresql


【解决方案1】:

工作。但是仍然不明白为什么UTF8不起作用。 我将编码更改为 LATIN1 并且它起作用了

\copy s_m_asset_7140 FROM 'C:\ER\ETL\Unzip_7140\asset.csv' csv HEADER QUOTE '"' ENCODING 'LATIN1';

有人能解释一下为什么 UTF8 不起作用吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多