gpt4 book ai didi

c++ - Oracle OCI 将无效的 UTF8 字符更改为 U+FFFD

转载 作者:太空宇宙 更新时间:2023-11-04 14:00:07 24 4
gpt4 key购买 nike

我正在编写一个 C++ 数据转换程序,它将数据从 ODBC 数据源复制到 Oracle 数据库中。由于要移动的数据量非常大(数十亿行),因此选择了 C++(具有数组操作)。

现在文本列“应该”是 UTF-8,但情况并非总是如此。如果不是,我仍然想将无效的原始字节复制到 Oracle 中。我们稍后会清理它们。该列是一个简单的 VARCHAR2(100),因此有 100 个字节长。但 Oracle 似乎正在尝试对数据进行某种 UTF-8 解析/处理。

例如以下字符串(已被截断为 100 个字节,因此无效):

Hex Bytes: 46 46 54 F0 9F 98 84 F0 9F 98 88 F0 9F 98 94 F0 9F 98 85 F0 9F 98 90 F0 9F 98 88 F0 9F 98 94 F0 9F 98 88 F0 9F 98 85 F0 9F 98 94 F0 9F 98 86 F0 9F 98 94 F0 9F 98 85 F0 9F 98 90 F0 9F 98 90 F0 9F 98 86 F0 9F 98 90 F0 9F 98 90 F0 9F 98 87 F0 9F 98 90 F0 9F 98 92 F0 9F 98 88 F0 9F 98 9A F0 9F 98 88 F0

http://tinyurl.com/nhhkf62

实际上被插入到数据库中:

Hex Bytes: 46 46 54 EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD

http://tinyurl.com/orkv6z6

这基本上是前导 3 个 ascii 字符,后跟每个后续字节的 U+FFFD 的 UTF-8 编码。

其他细节:

Oracle Version: 11g Enterprise Edition Release 11.2.0.1.0
Oracle Client: oracle-instantclient11.2-basic-11.2.0.3.0-1
Oracle OCI rpm: oracle-instantclient11.2-devel-11.2.0.3.0-1
Environment: LANG=en_US.UTF-8
Environment: NLS_CHARACTERSET=AMERICAN_AMERICA.UTF8
Environment: NLS_LANG=AMERICAN.UTF8

那么有人知道为什么 Oracle 和/或 OCI 正在修改这些数据吗?有没有办法阻止它发生?

谢谢

最佳答案

NLS_LANG 对于隐式字符转换最为重要。我认为应该是 NLS_LANG=AMERICAN_AMERICA.UTF8 而不是 NLS_LANG=AMERICAN.UTF8

你的数据库字符集是什么?

关于c++ - Oracle OCI 将无效的 UTF8 字符更改为 U+FFFD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19672212/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com