我在这里重新表述我的问题。我正在使用AWS工具从Oracle迁移到PostgreSQL。源(甲骨文)字符集为AL32UTF8,目标字符集设置为UT8。
因此,在源代码中,我有一个包含数据类型varchar2(4000),的列,其中存储了如下内容:
This will be my first time visiting Seattle. 当我试图迁移它时,我会得到以下错误:
ERROR: invalid byte sequence for encoding "UTF8": 0xed 0xa0 0xbd在DMS中有一种方法可以跳过这一点,但问题是我必须每次运行DMS,等待它给出无效的字节序列错误,然后通过它。到目前为止,我有这么多人:
0xed 0xa4 0x88
0xed 0xbd 0x95
0xed 0xa9 0x8e
0xed 0xbc 0xb8
0xed 0xaa 0xbe
0xed 0xba 0xb5
0xed 0xaf 0x83
0xed 0xb5 0xaa
0xed 0xa0 0xbc
0xed 0xbc 0x9f
0xed 0xa0 0xbd
0xed 0xb8 0xa0
0xed 0xbe 0x88
0xed 0xb1 0x8e
0xed 0xb1 0x8e
0xed 0xb1 0x8d
0xed 0xb3 0x99
0xed 0xb1 0x9f
0xed 0xbe 0xa7
0xed 0xb1 0x8c
0xed 0xa0 0xbe
0xed 0xb4 0x96
0xed 0xba 0x80
0xed 0xb4 0xb1
0xed 0xb0 0xa7
0xed 0xbe 0xb8
0xed 0xbe 0xb5
0xed 0xb7 0xbb
0xed 0xb1 0x86
0xed 0xbe 0xb6
0xed 0xbf 0x8a
0xed 0xb0 0xab
0xed 0xb0 0x95
0xed 0xb0 0x94
0xed 0xb0 0x99
0xed 0xb0 0xb1
0xed 0xbf 0x84
0xed 0xba 0x82
0xed 0xb4 0xa8
0xed 0xb0 0xaf
0xed 0xb0 0xb8
0xed 0xb3 0x9e
0xed 0xb4 0xa7
0xed 0xbe 0x81
0xed 0xb1 0x87从这里的一个论坛帖子中,我得到了以下查询:
select CASE
INSTR (
RAWTOHEX (
utl_raw.cast_to_raw (
utl_i18n.raw_to_char (
utl_raw.cast_to_raw ( <your_column> )
, 'utf8'
)
)
)
, 'EFBFBD'
)
WHEN 0 THEN 'OK'
ELSE 'FAIL'
END
from <your_table>
;是否可以修改上面的查询以生成正则表达式来检查所有的非法UTF8编码。
此外,在将client_encoding更改为LATIN1之后,我成功地完成了迁移,但在PG端得到了这样的结果:
This will be my first time visiting Seattle. э НэИ请回顾并评论
发布于 2017-07-10 08:14:21
Oracle (或任何其他适当支持UTF-8的系统)无法存储无效的 UTF-8字符,迁移时肯定会出现问题。仔细检查有关字符集的每一个设置。编码-包括终端设置和/或编辑器。
字符U+1F60A SMILING FACE WITH SMILING EYES属于多语种辅助平面上的块表情符号。也许您的迁移工具对于基本多语言平面以外的字符有一个普遍的问题,即U+FFFF之上的字符。
找到他们的一种方法是
SELECT *
FROM ...
WHERE REGEXP_LIKE(<your_column>, UNISTR('[\0001-\FFFF]'));此条件只返回基本多语言平面上的字符。
你也可以这样做:
SELECT
REGEXP_SUBSTR('This will be my first time visiting Seattle. ', UNISTR('[\FFFF-\DBFF\DFFF]'))
FROM dual;
REGEXP_SUBSTR('THISWILLBEMYFIRSTTIMEVISITINGSEATTLE.',UNISTR('[\FFFF-\DBFF\DFFF]
--------------------------------------------------------------------------------
1 row selected.更新
我又查了一遍。
U+1F60A SMILING FACE WITH SMILING EYESUNISTR('\D83D\DE0A')AL32UTF8):F0 9F 98 8AUTF8):ED A0 BD ED B8 8A您的错误消息是:“编码”UTF8“的无效字节序列:0xa0xbd”
ED A0 BD是CESU-8序列.显然,您从Oracle的导出是以CESU-8 提供的,而不是以UTF-8的形式提供的。再检查一下你的设置。
更新2
为了替换现有数据中的补充字符,可以尝试以下方法:
UPDATE FDRGIIT.CS_ACTIONS
SET CS_COMMENTS = REGEXP_REPLACE(CS_COMMENTS, UNISTR('[\FFFF-\DBFF\DFFF]'), UNISTR('\00BF'));或
UPDATE FDRGIIT.CS_ACTIONS
SET CS_COMMENTS = REGEXP_REPLACE(CS_COMMENTS, UNISTR('[\FFFF-\DBFF\DFFF]'));UNISTR('\00BF')是Oracle对无效字符使用的占位符(¿)。UNISTR('\FFFD') -> (�)也可能是适宜的。
https://stackoverflow.com/questions/44402799
复制相似问题