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

时间:2013-10-30 01:27:33

标签: c++ oracle unicode utf-8 oci

我正在编写一个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正在修改这些数据?有没有办法阻止它发生?

由于

1 个答案:

答案 0 :(得分:0)

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

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