【问题标题】:Postgres COPY FROM ... WITH BINARY returns an error "literal carriage return found in data"Postgres COPY FROM ... WITH BINARY 返回错误“在数据中找到文字回车”
【发布时间】:2018-09-29 16:08:39
【问题描述】:

我有两个功能。一种将变量 (uuid) 复制到一个数据库上的二进制文件的方法。

CREATE OR REPLACE FUNCTION ECRS."MIGRATION.DBF_COPY_TO"(file_name VARCHAR(500))
    RETURNS INTEGER AS $$

DECLARE 
iniPath varchar(500) = file_name || '/Ini.dat';
researchIdToCopy uuid;

BEGIN
    SELECT R.RESEARCHID FROM ECRS.RESEARCH R WHERE R.NAME = 'BADANIE_TESTOWE' INTO researchIdToCopy;

    EXECUTE('COPY (SELECT '''|| researchIdToCopy ||''') TO ' || quote_literal(iniPath)|| ' WITH BINARY');

RETURN 1;
END; $$

LANGUAGE plpgsql;

第二个负责从文件中复制这些数据并将其存储到另一个 postgress 数据库的变量中。

CREATE OR REPLACE FUNCTION ECRS."MIGRATION.DBF_COPY_FROM"(file_name VARCHAR(500))
    RETURNS INTEGER AS $$

DECLARE 

iniPath varchar(500) = file_name || '/Ini.dat';

researchIdToInsert text;
tmp text;


BEGIN

-- get research id (store ini file in tmp table and select from it)
tmp := quote_ident(uuid_generate_v4()::text);
EXECUTE 'CREATE TEMP TABLE ' || tmp || ' (researchid text)';
EXECUTE 'COPY ' || tmp || ' FROM ' || quote_literal(iniPath);
EXECUTE 'SELECT researchid FROM ' || tmp INTO researchIdToInsert;
EXECUTE 'DROP TABLE ' || tmp;

-- DO SOMETHING MORE ...


RETURN 1;
END; $$

LANGUAGE plpgsql; 

执行函数 DBF_COPY_FROM 时出错:

ERROR:  literal carriage return found in data
HINT:  Use "\r" to represent carriage return.
CONTEXT:  COPY f4c96770-f2f3-45e9-8678-1626b9bef843, line 2
SQL statement "COPY "f4c96770-f2f3-45e9-8678-1626b9bef843" FROM 'C://Test/Ini.dat'"
PL/pgSQL function ecrs."MIGRATION.DBF_COPY_FROM"(character varying) line 29 at EXECUTE

两个数据库具有相同的属性:

  • 编码 = 'UTF8'
  • TABLESPACE = pg_default
  • LC_COLLATE ='English_United Kingdom.1252'
  • LC_CTYPE = 'English_United Kingdom.1252'
  • 连接限制 = -1;

我尝试过使用 将client_encoding设置为'WIN1252'; 要么 将 client_encoding 设置为“UTF8”;但它不起作用。

【问题讨论】:

    标签: postgresql plsql copy


    【解决方案1】:

    你用MIGRATION.DBF_COPY_TO写一个文件然后用MIGRATION.DBF_COPY_FROM读它我理解正确吗?

    如果是,那不行,因为第一个函数使用二进制格式,而第二个函数使用文本格式。

    在文本模式COPY 中不允许使用不带换行符的回车符,但在这种情况下,这是您使用不同格式进行输入和输出的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-21
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      • 2022-07-17
      • 2017-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多