首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle将无效UTF8字符更改为U+FFFD

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

Stack Overflow用户
提问于 2013-10-30 01:27:32
回答 1查看 1.7K关注 0票数 1

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

现在,文本列被“假定”为UTF-8,但情况并不总是如此。如果不是,我仍然希望将无效的原始字节复制到Oracle中。我们稍后会把它们清理干净。该列是一个简单的VARCHAR2(100),长度为100个字节。但是Oracle似乎在尝试对数据进行某种类型的UTF-8解析/处理。

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

代码语言:javascript
复制
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

实际上正在将以下内容插入到数据库中:

代码语言:javascript
复制
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编码,用于每个后续字节。

其他详情:

代码语言:javascript
复制
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为什么要修改这些数据吗?有什么办法阻止它的发生吗?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-30 06:07:01

NLS_LANG是隐式字符转换中最重要的部分。我想应该是NLS_LANG=AMERICAN_AMERICA.UTF8而不是NLS_LANG=AMERICAN.UTF8

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19672212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档