1

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

现在文本列“假定”为 UTF-8,但情况并非总是如此。如果不是,我仍然想将无效的原始字节复制到 Oracle 中。我们稍后会清理它们。该列是一个简单的VARCHAR2(100)100 字节长。但甲骨文似乎正在尝试对数据进行某种 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 会修改这些数据吗?有没有办法阻止它发生?

谢谢

4

1 回答 1

0

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

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

于 2013-10-30T06:07:01.257 回答