Oracle postgresql 9.5-解码/选择案例以解决utf8错误不起作用
在延续至my-“oracle到postgresql的迁移”中,编码“UTF8”的字节序列无效:0x00 我试图从远程oracle表(通过oracle_fdw扩展)向本地postgresql表插入数据。我的oracle表有一个名为street的列,它有有效的字符串值,有时还有下一个无效的(在postgresql中)字符串:“”(空格)。当我试图复制列值时,我得到了上面和我上一篇文章中提到的错误。我明白在将oracle数据插入postgresql之前需要更改它。我必须马上做,所以我试着在postgresql中搜索oracle decode func。我找到了两种解决方案,并使用了这两种方法,但我得到了相同的错误: 1.将选择与案例一起使用:Oracle postgresql 9.5-解码/选择案例以解决utf8错误不起作用,oracle,postgresql,utf-8,oracle-fdw,Oracle,Postgresql,Utf 8,Oracle Fdw,在延续至my-“oracle到postgresql的迁移”中,编码“UTF8”的字节序列无效:0x00 我试图从远程oracle表(通过oracle_fdw扩展)向本地postgresql表插入数据。我的oracle表有一个名为street的列,它有有效的字符串值,有时还有下一个无效的(在postgresql中)字符串:“”(空格)。当我试图复制列值时,我得到了上面和我上一篇文章中提到的错误。我明白在将oracle数据插入postgresql之前需要更改它。我必须马上做,所以我试着在postgr
mydb=>select *,(case when v.street=' ' then null END) from customer_prod v;
ERROR: invalid byte sequence for encoding "UTF8": 0x00
CONTEXT: converting column "street" for foreign table scan of
"customer_prod", row 254148
2.使用orafce扩展的解码功能:
mydb=>select decode(street,' ',null) from customer_prod;
ERROR: invalid byte sequence for encoding "UTF8": 0x00
所以,我还是得到了错误。知道我如何解决这个问题吗?当值从Oracle传输到PostgreSQL时会发生错误,因此后处理无法防止错误 为了演示,让我们创建一个Oracle表来展示问题:
CREATE TABLE nulltest(
id number(5) CONSTRAINT nulltest_pkey PRIMARY KEY,
val varchar2(10 CHAR)
);
INSERT INTO nulltest VALUES (1, 'schön');
INSERT INTO nulltest VALUES (2, 'bö' || CHR(0) || 'se');
INSERT INTO nulltest VALUES (3, 'egal');
COMMIT;
让我们在PostgreSQL中为其创建一个外部表:
CREATE FOREIGN TABLE nulltest (
id integer OPTIONS (key 'true') NOT NULL,
val varchar(10)
) SERVER oracle
OPTIONS (table 'NULLTEST');
SELECT * FROM nulltest;
ERROR: invalid byte sequence for encoding "UTF8": 0x00
CONTEXT: converting column "val" for foreign table scan of "nulltest", row 2
现在最简单的方法是创建一个外来表,过滤掉零个字符:
CREATE FOREIGN TABLE filter_nulltest (
id integer OPTIONS (key 'true') NOT NULL,
val varchar(10)
) SERVER oracle
OPTIONS (table '(SELECT id, replace(val, CHR(0), NULL) FROM nulltest)');
SELECT * FROM filter_nulltest;
┌────┬───────┐
│ id │ val │
├────┼───────┤
│ 1 │ schön │
│ 2 │ böse │
│ 3 │ egal │
└────┴───────┘
(3 rows)
另一个效率较低的选项是创建一个函数,用于捕获并向您报告错误行,以便您可以在Oracle端修复它们:
CREATE OR REPLACE FUNCTION get_nulltest() RETURNS SETOF nulltest
LANGUAGE plpgsql AS
$$DECLARE
v_id integer;
n nulltest;
BEGIN
FOR v_id IN SELECT id FROM nulltest
LOOP
BEGIN
SELECT nulltest.* INTO n
FROM nulltest
WHERE id = v_id;
RETURN NEXT n;
EXCEPTION
WHEN OTHERS THEN
RAISE NOTICE 'Caught error % for id=%: %', SQLSTATE, v_id, SQLERRM;
END;
END LOOP;
END;$$;
SELECT * FROM get_nulltest();
NOTICE: Caught error 22021 for id=2: invalid byte sequence for encoding "UTF8": 0x00
┌────┬───────┐
│ id │ val │
├────┼───────┤
│ 1 │ schön │
│ 3 │ egal │
└────┴───────┘
(2 rows)
将值从Oracle传输到PostgreSQL时会发生错误,因此后处理无法防止此错误 为了演示,让我们创建一个Oracle表来展示问题:
CREATE TABLE nulltest(
id number(5) CONSTRAINT nulltest_pkey PRIMARY KEY,
val varchar2(10 CHAR)
);
INSERT INTO nulltest VALUES (1, 'schön');
INSERT INTO nulltest VALUES (2, 'bö' || CHR(0) || 'se');
INSERT INTO nulltest VALUES (3, 'egal');
COMMIT;
让我们在PostgreSQL中为其创建一个外部表:
CREATE FOREIGN TABLE nulltest (
id integer OPTIONS (key 'true') NOT NULL,
val varchar(10)
) SERVER oracle
OPTIONS (table 'NULLTEST');
SELECT * FROM nulltest;
ERROR: invalid byte sequence for encoding "UTF8": 0x00
CONTEXT: converting column "val" for foreign table scan of "nulltest", row 2
现在最简单的方法是创建一个外来表,过滤掉零个字符:
CREATE FOREIGN TABLE filter_nulltest (
id integer OPTIONS (key 'true') NOT NULL,
val varchar(10)
) SERVER oracle
OPTIONS (table '(SELECT id, replace(val, CHR(0), NULL) FROM nulltest)');
SELECT * FROM filter_nulltest;
┌────┬───────┐
│ id │ val │
├────┼───────┤
│ 1 │ schön │
│ 2 │ böse │
│ 3 │ egal │
└────┴───────┘
(3 rows)
另一个效率较低的选项是创建一个函数,用于捕获并向您报告错误行,以便您可以在Oracle端修复它们:
CREATE OR REPLACE FUNCTION get_nulltest() RETURNS SETOF nulltest
LANGUAGE plpgsql AS
$$DECLARE
v_id integer;
n nulltest;
BEGIN
FOR v_id IN SELECT id FROM nulltest
LOOP
BEGIN
SELECT nulltest.* INTO n
FROM nulltest
WHERE id = v_id;
RETURN NEXT n;
EXCEPTION
WHEN OTHERS THEN
RAISE NOTICE 'Caught error % for id=%: %', SQLSTATE, v_id, SQLERRM;
END;
END LOOP;
END;$$;
SELECT * FROM get_nulltest();
NOTICE: Caught error 22021 for id=2: invalid byte sequence for encoding "UTF8": 0x00
┌────┬───────┐
│ id │ val │
├────┼───────┤
│ 1 │ schön │
│ 3 │ egal │
└────┴───────┘
(2 rows)
非常感谢你,劳伦斯!在最后的帖子里你帮了我很多。你是最棒的!CHR(0)=''(空格)吗?当我将CHR(0)与“”切换时,SELECT起作用,但如果我使用CHR(0),我会得到错误:在Oracle中不允许使用空字符
CHR(0)'
。在PostgreSQL中,您不能像前面解释的那样拥有CHR(0)
。我问它是因为我在有问题的列中拥有的值是“”。所以我想知道在postgresql中“”是否是CHR(0)。我意识到我有3个有问题的列,所以我对它们都运行了replace函数。我的桌子尺寸是600米。当我运行select时,消息被终止。这是一个性能问题吗?我在选择10G大小的表时没有任何问题。非常感谢Laurenz!在最后的帖子里你帮了我很多。你是最棒的!CHR(0)=''(空格)吗?当我将CHR(0)与“”切换时,SELECT起作用,但如果我使用CHR(0),我会得到错误:在Oracle中不允许使用空字符CHR(0)'
。在PostgreSQL中,您不能像前面解释的那样拥有CHR(0)
。我问它是因为我在有问题的列中拥有的值是“”。所以我想知道在postgresql中“”是否是CHR(0)。我意识到我有3个有问题的列,所以我对它们都运行了replace函数。我的桌子尺寸是600米。当我运行select时,消息被终止。这是一个性能问题吗?我从表中选择大小为10G的表没有任何问题。。