【问题标题】:migration oracle to postgresql invalid byte sequence for encoding "UTF8": 0x00将 oracle 迁移到 postgresql 用于编码“UTF8”的无效字节序列:0x00
【发布时间】:2020-12-16 23:42:35
【问题描述】:

我正在将应用程序从 oracle 迁移到 postgresql。在我已经迁移的一个函数中,我将数据从不同的 oracle 数据库(oracle 中的 db 链接,postgresql 中的 oracle_fdw 扩展)从几个表复制到我的 postgresql db 中的本地表中。但是,我收到下一个错误:

invalid byte sequence for encoding "UTF8": 0x00

我看到有些人在这个论坛上遇到过这种问题,但他们没有尝试直接从远程数据库复制数据(他们从转储或 csv 加载数据..)。

有点想法我能做什么?

【问题讨论】:

  • 什么是 Oracle DB 编码?
  • nls_characterset : IW8ISO8859P8

标签: oracle postgresql utf-8 plpgsql oracle-fdw


【解决方案1】:

PostgreSQL 不允许字符串中出现“零”字符。

您必须先清理 Oracle 数据,然后才能从 PostgreSQL 中检索它们。

【讨论】:

  • “零”字符是什么意思?在涉及到 postgresql 之前如何过滤数据?我在 postgresql 中运行查询插入到 local_table select * from remote_table
  • 对于“零字符”,我的意思是 ASCII(或 UNICODE)代码点为 0 的字符。从remote_table 中选择时会引发错误 - 那里的某些字符串列包含这样的字符。您必须修复 Oracle 端的数据。
  • 我认为那些只是没有任何值的 varchar 列 - varchar 的 null。那么我到底需要改变什么?
  • 不,NULL 值不会有问题。如果您在 Oracle 中选择这样的违规值:SELECT dump(badcol, 16) FROM atable WHERE id = 42,您将在那里的某处看到一个字节 0x00。这就是问题所在(将badcolatableid 和 42 替换为适合您情况的相关值)。
  • 我在 postgresql 中得到的错误没有指定哪一行有问题 - 只有 table_name 和列。我该如何从这里开始?例如:插入MANUIM select * from MAUIM_prod;错误:编码“UTF8”的无效字节序列:0x00 上下文:转换列“street”以进行“manuim_prod”的外部表扫描,行 922311
【解决方案2】:

现在它适用于 oracle_fdw 2.3.+ 这是我使用的代码

select 'ALTER FOREIGN TABLE "'||table_schema||'"."'||table_name||'" ALTER COLUMN "'||column_name||'"  OPTIONS (ADD strip_zeros ''true'');' 
from information_schema."columns" c 
where table_name ='my_foreign_table_name'
and table_schema ='my_schema_name_where_foreign_table_created'
and udt_name in ('varchar', 'bpchar');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-28
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 2021-08-19
    • 2021-09-19
    • 2016-12-02
    • 2011-06-19
    相关资源
    最近更新 更多