使用 Python 使用正确的编码从 Oracle 导入

2024-06-24

我很抱歉提出一个字符编码问题,因为我知道你们每天都会遇到很多问题,但我无法弄清楚我的问题,所以我还是问了。

这是我们正在做的事情:

  1. 使用 Python 从 Oracle DB 获取数据并cx_Oracle.
  2. 使用 Python 将数据写入文件。
  3. 使用 Python 将文件引入 Postgres 并psycopg2.

以下是重要的 Oracle 设置:

SQL> select * from NLS_DATABASE_PARAMETERS;

PARAMETER                      VALUE
------------------------------ ----------------------------------------
NLS_LANGUAGE                   AMERICAN
NLS_TERRITORY                  AMERICA
NLS_CURRENCY                   $
NLS_ISO_CURRENCY               AMERICA
NLS_NUMERIC_CHARACTERS         .,
NLS_CHARACTERSET               US7ASCII

根据这个NLS_LANG faq http://www.oracle.com/technetwork/database/globalization/nls-lang-099431.html#_Toc110410550,您应该根据客户端操作系统使用的内容设置 NLS_LANG。

Running locale给我们:LANG=en_US.UTF-8(所有其他字段也是 en_US.UTF-8)。

因此,在我们的 Python 脚本中,我们这样设置:

os.environ["NLS_LANG"] = "AMERICAN_AMERICA.AL32UTF8"

然后我们导入数据并将其写入文件。

row = cur.fetchall()
fil.write(row[0][0]) #For this test, I am only writing one row and one field.

我们将该文件提取到 UT​​F-8 Postgres 数据库中。

不幸的是,由于某种原因,我们在我们的文件和随后的 PG 表中得到了这个符号:�。如果我的理解正确的话,这就是替换字符 http://www.fileformat.info/info/unicode/char/fffd/index.htm。我相信如果 Unicode 无法识别某个符号,该字符就会显示出来。

(在某些文本编辑器中,该符号显示为�).

我不明白的是为什么会发生这种情况?我认为 UTF-8 向后兼容 7 位 ASCII?

即使我们使用区域页面,它是否仍然可以工作,因为客户端使用的是 US,而 Oracle 服务器使用的是 AMERICAN?

如何检查数据是否正确导入,如果不正确,如何修复它以便将来导入?

注意:Oracle 字段是CHAR字段而不是NCHAR field.

注意2:我们使用的是Python 2.4,因此Python 3.X 中没有原生的Unicode 内容。因此,Python 可能在某个地方搞砸了,尽管我认为 cx_Oracle 已经解决了这一切。

感谢您抽出宝贵的时间,希望您有美好的一天。


不幸的是,由于某种原因,我们在我们的文件和随后的 PG 表中得到了这个符号:�。如果我的理解是正确的,这就是替换字符。我相信如果 Unicode 无法识别某个符号,该字符就会显示出来。

大部分是正确的,但不完全正确。使用该编码时,PostgreSQL 将拒绝插入非 UTF8 文本字符(在 StackOverflow 上搜索“Invalid UTF8 postgresql”)。您看到的字符很可能是您无法识别的有效 UTF8 字符font因此显示替换字符。如果该符号在您的 Oracle 数据库中并且实际上是那里的替换符号,那么您想用什么替换它?如果是这样的话,那么信息就已经丢失了。

我不明白的是为什么会发生这种情况?我认为 UTF-8 向后兼容 7 位 ASCII?

It is.

如何检查数据是否正确导入,如果不正确,如何修复它以便将来导入?

您的问题很可能出在 Oracle 数据库的上游。我会找出到底是什么将问题数据插入到 Oracle 数据库中并在那里修复它。如果您可以对照 Oracle 中的数据检查 Pg 中的数据,您应该能够确定数据是否逐个字符相同(并标记任何差异)。这就是检查当前导入的方法。

注意2:我们使用的是Python 2.4,因此Python 3.X 中没有原生的Unicode 内容。因此,Python 可能在某个地方搞砸了,尽管我认为 cx_Oracle 已经解决了这一切。

那是另一种可能。就文件转换而言,我个人更喜欢 Perl,因为它集成了正则表达式和绝对顶级的 PostgreSQL 支持。不过,我认识到您的导入例程此时可能无法轻松转换。与 Python 相比,我对 Perl 中的 UTF8 转换问题的故障排除更加熟悉。不过,我确实想知道您是否可以检查以二进制格式输出的此类符号的数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Python 使用正确的编码从 Oracle 导入 的相关文章

随机推荐

  • 如何向heroku节点服务器添加python依赖项?

    我有一个运行 Node 的 Heroku 应用程序 但我需要能够在此服务器上运行 Python 脚本 我正在尝试安装我的 Python 依赖项 但无法让它工作 我已将 python 和节点构建包添加到我的项目中 我已创建虚拟环境并成功安装了
  • .Net 中的 Midi 实现

    有人对在 C Winforms 中编写基于 MIDI 的应用程序有任何指导或建议吗 我最近购买了一个新的效果踏板 它具有完整的 MIDI 实现 或者我相信 但制造商认为不发布图书馆员 补丁编辑应用程序是合适的 除了将键盘插入另一个 MIDI
  • 启动包中没有指定postgresql用户名

    public class HelloPostgreSQLActivity extends Activity TextView resultArea Override public void onCreate Bundle savedInst
  • Erlang:远程调用与发送消息

    我想在远程节点上执行一些过程 我不确定哪种方法是最好的方法 我可以写一个rpc call去做这个 或通过以下方式发送消息Remote call some procedure 到节点来启动程序并使用receive等待回复 那么erlang中哪
  • 将数据从 Django 传递到 D3

    我正在尝试使用 Django 和 D3 js 编写一个非常基本的条形图 我有一个名为 play 的对象 其中包含一个名为 date 的日期时间字段 我想要做的是显示一段时间内按月分组的播放次数 基本上我有两个问题 如何将这些内容按月分组并统
  • 应用程序在后台时如何处理 iOS 远程通知

    我正在通过苹果推送通知开发iOS推送通知功能 现在当我的应用程序处于后台或前台时我收到了正确的通知 但我想当我的应用程序处于后台时基本上当我的应用程序处于后台时处理远程通知只是显示来自有效负载的警报消息 实际上我只是想自定义我的远程通知 c
  • 亚马逊网络服务工作示例

    我进行了各种搜索 尝试让产品广告 API 正常工作 我尝试了来自这些论坛和互联网的许多示例 但它不起作用 有人讨论过修改 WSDL 但这也不起作用 这是我去过的地方 https affiliate program amazon com gp
  • NSProxy 如何“将自身转变为另一个对象”?

    The NSProxy 类参考 http developer apple com library mac documentation Cocoa Reference Foundation Classes NSProxy Class Refe
  • 如果运行战争,oracle 和 sybase 数据库连接会出现 ClassNotFoundError,但在 eclipse 中工作正常

    我在应用程序中构建了一个功能来测试数据库连接 在本地 我能够测试所有三个数据库 sqlserver sybase 和 oracle 但如果创建 war 文件并在 Windows Linux 服务器中运行 war 则 Oracle 和 syb
  • 过滤器链因 [:login_required] returned_or_redirected 而停止

    希望我能很好地解释这一点 但如果需要更多信息 请告诉我 我正在构建一个表单 用户可以在其中创建 事件 此次事件有如下关系 属于 客户 客户有很多事件 belongs to 用户 用户有很多事件 has one incident status
  • 如何在Python中检查神秘的反序列化对象

    我正在尝试将 JSON 加载回对象中 loads 方法似乎工作正常 但该对象似乎没有我期望的属性 我怎样才能检查 检查我拥有的对象 这是基于网络的代码 results Subscriber firstname Neal lastname W
  • 获取背景图片url值

    我正在尝试获取背景图像 url 的值 url 直接在元素标签中使用 style 属性内联设置 如下所示 a style background image none a 我尝试做 var url this css background ima
  • 使用 ESC 关闭引导模式

    我正在使用 2 个模态 第一个模态包含一个表单 第二个模态在表单中发生错误时显示 第二个模式仅包含带有错误消息的文本 My problem is that when 2nd modal show up and I press Esc the
  • 如何在heroku-django项目中设置环境变量?

    我的 settings py 中有这段代码 EMAIL HOST smtp sendgrid net EMAIL HOST USER os environ get EMAIL HOST USER EMAIL HOST PASSWORD os
  • 添加依赖项会出现错误:“react-scripts”未被识别为内部或外部命令、可操作程序或批处理文件”

    还有其他人遇到这个问题吗 当我使用 create react app 创建一个新项目 并且添加除库存依赖项之外的任何依赖项 即react redux redux react router dom 时 我收到以下错误 react script
  • 为什么 CSV 文件中的多行单元格在 Excel 中每行末尾都显示有问号?

    我目前正在开发一个项目 我们希望允许用户将数据导出到 CSV 我们提供的一些数据在单个单元格中具有多个值 因此我们使用标准 CSV 方法将每个值放在自己的行上 Column A Column B Column C Value A Value
  • 基于每个应用程序域的字符串哈希码计算的实际使用

    在 NET 4 5 中 可以选择使用随机字符串哈希代码生成 这意味着 同一个字符串在不同的应用域中计算出的哈希码将会不同 看http msdn microsoft com en us library jj152924 aspx http m
  • 是否应该在使用 MVC 的每个视图中使用 ViewModel?

    我了解您使用 ViewModel 来存储来自其他模型和源的不同数据以在视图中使用 因为模型并不总是包含您想要的内容 我试图弄清楚为每个视图使用 ViewModel 是否合适 我问的原因是出于一致性原因 您可以有一个仅需要模型本身的视图 以及
  • 有没有办法编写 BSTR 文字?

    当调用需要 BSTR 的函数时 最好能够编写如下内容 iFoo gt function bs HELLO 然而 我知道的唯一解决方法是使用一个调用的包装器SysAllocString等等 例如 iFoo gt function WideSt
  • 使用 Python 使用正确的编码从 Oracle 导入

    我很抱歉提出一个字符编码问题 因为我知道你们每天都会遇到很多问题 但我无法弄清楚我的问题 所以我还是问了 这是我们正在做的事情 使用 Python 从 Oracle DB 获取数据并cx Oracle 使用 Python 将数据写入文件 使