首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Oracle迁移到PostgreSQL时无效的PostgreSQL字符

从Oracle迁移到PostgreSQL时无效的PostgreSQL字符
EN

Stack Overflow用户
提问于 2017-06-07 03:00:24
回答 1查看 4K关注 0票数 0

我在这里重新表述我的问题。我正在使用AWS工具从Oracle迁移到PostgreSQL。源(甲骨文)字符集为AL32UTF8,目标字符集设置为UT8

因此,在源代码中,我有一个包含数据类型varchar2(4000),的列,其中存储了如下内容:

代码语言:javascript
复制
This will be my first time visiting Seattle. 

当我试图迁移它时,我会得到以下错误:

代码语言:javascript
复制
ERROR: invalid byte sequence for encoding "UTF8": 0xed 0xa0 0xbd

在DMS中有一种方法可以跳过这一点,但问题是我必须每次运行DMS,等待它给出无效的字节序列错误,然后通过它。到目前为止,我有这么多人:

代码语言:javascript
复制
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

从这里的一个论坛帖子中,我得到了以下查询:

代码语言:javascript
复制
 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端得到了这样的结果:

代码语言:javascript
复制
This will be my first time visiting Seattle. э НэИ

请回顾并评论

EN

回答 1

Stack Overflow用户

发布于 2017-07-10 08:14:21

Oracle (或任何其他适当支持UTF-8的系统)无法存储无效的 UTF-8字符,迁移时肯定会出现问题。仔细检查有关字符集的每一个设置。编码-包括终端设置和/或编辑器。

字符U+1F60A SMILING FACE WITH SMILING EYES属于多语种辅助平面上的块表情符号。也许您的迁移工具对于基本多语言平面以外的字符有一个普遍的问题,即U+FFFF之上的字符。

找到他们的一种方法是

代码语言:javascript
复制
SELECT *
FROM ...
WHERE REGEXP_LIKE(<your_column>, UNISTR('[\0001-\FFFF]'));

此条件只返回基本多语言平面上的字符。

你也可以这样做:

代码语言:javascript
复制
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 EYES
  • 可以写成UNISTR('\D83D\DE0A')
  • 编码为UTF-8 (甲骨文字符集AL32UTF8):F0 9F 98 8A
  • 编码为CESU-8 (甲骨文字符集UTF8):ED A0 BD ED B8 8A

您的错误消息是:“编码”UTF8“的无效字节序列:0xa0xbd”

ED A0 BD是CESU-8序列.显然,您从Oracle的导出是以CESU-8 提供的,而不是以UTF-8的形式提供的。再检查一下你的设置。

更新2

为了替换现有数据中的补充字符,可以尝试以下方法:

代码语言:javascript
复制
UPDATE FDRGIIT.CS_ACTIONS
SET CS_COMMENTS = REGEXP_REPLACE(CS_COMMENTS, UNISTR('[\FFFF-\DBFF\DFFF]'), UNISTR('\00BF'));

代码语言:javascript
复制
UPDATE FDRGIIT.CS_ACTIONS
SET CS_COMMENTS = REGEXP_REPLACE(CS_COMMENTS, UNISTR('[\FFFF-\DBFF\DFFF]'));

UNISTR('\00BF')是Oracle对无效字符使用的占位符(¿)。UNISTR('\FFFD') -> ()也可能是适宜的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44402799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档