【发布时间】: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