【问题标题】:Postgres foreign data wrapper encoding issuePostgres 外部数据包装器编码问题
【发布时间】:2017-07-13 12:24:05
【问题描述】:

我正在尝试将具有“we8mswin1252”编码的 Oracle 数据迁移到具有“UTF8”编码的 数据库。

我正在使用外国数据包装器

我来了

invalid byte sequence error

我该怎么办?

【问题讨论】:

  • 欢迎来到 StackOverflow!请阅读并遵循帮助文档中关于on topichow to ask 的发布指南。 StackOverflow 不是编码或教程服务。

标签: postgres oracle postgresql foreign-data-wrapper oracle-fdw


【解决方案1】:

这样的错误可能是由两件事引起的:

  • 您的 Oracle 字符串中可能有零字节。这在 Oracle 中是允许的(即使有问题),但在 PostgreSQL 中是禁止的。

  • Oracle 中很容易造成数据损坏,因为它对编码检查非常草率,并且允许您在客户端编码和服务器编码相同的情况下插入任意非法字节序列。

有两种方法可以解决这个问题:

  • 正确方法:在Oracle端修复数据。 oracle_fdw 将通过告诉您结果集中的哪一行导致错误来支持您。

  • 草率的方法:使用数据库编码为sql_ascii 的PostgreSQL 数据库,这将允许您将任何内容存储在字符串中(零字节除外)。

【讨论】:

  • Laurenz,感谢您的回复,但是我们可以单独创建一个带有 sql_ascii 编码的数据库吗?我们已将其设置为 utf8 格式。此外,我们无法编辑 oracle 数据。
  • 当然:CREATE DATABASE badchars ENCODING sql_ascii LC_COLLATE "C" LC_CTYPE "C" TEMPLATE template0; 然后您应该在外部数据包装器上设置nls_lang 选项,如果您希望垃圾数据不变,则使用WE8MSWIN1252;如果您希望它们转换为,则使用AS32UTF8 UTF-8 尽可能好。零字节仍然是个问题。
猜你喜欢
  • 2018-04-22
  • 1970-01-01
  • 2019-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多