2011-03-14 25 views
4

我有一个表中,我们的服务提供商插入UNICODE数据,但我的oracle字符集是WE8ISO8859P1。如何转换在Oracle中的列的字符集

现在得到的数据我使用了oracle的以下功能,但它显示???????从client_campaigns

选择转换(消息, 'AL32UTF8', 'WE8ISO8859P1')

一个件事多个消息coulmn是CLOB类型。

由于dataloss,我不能改变我的数据库的字符集,第二,它的生产和字符集中的变化可能导致错误。

现在请指导我如何以UNICODE的形式获取这些数据?

问候, 姆兰

回答

7

字符串插入的字符(或VARCHAR2 CHAR或CLOB)柱将总是被转换为数据库的字符集。这意味着插入的数据将转换为WE8ISO8859P1。由于UNICODE不是WE8ISO8859P1的子集,因此您将失去信息。在插入时,字符集中不可用的某些字符会转换为?

你应该怎么做?新数据有两种选择:

  1. 将列的数据类型修改为NVARCHAR2而不是VARCHAR2(或NCLOB而不是CLOB)。 NVARCHAR2是专门设计的,因此您可以在不修改主分贝字符集的情况下处理多字节字符。有关VARCHAR2和NVARCHAR2之间的差异,请参阅this SO question)。也请注意,某些应用程序may not work correctly with NVARCHAR2
  2. 您可以将列修改为RAW或BLOB,并将您的字符串直接写入二进制流。当您再次阅读时,它仍然是UNICODE数据。然而,数据库很难对这个列数据做任何事情:排序将是二进制的,搜索将是有问题的,因为您将无法正确使用LIKE运算符。
  3. 如果你有很多的UNICODE输入,你可以考虑修改你的数据库字符集。这将是最昂贵的选项(您可能需要导出/重新安装/导入),但之后所有列都将具有正确的数据类型。

如果给出选择,我会选择(1)或(3)。使用RAW会禁用很多功能并增加复杂性。

显然以前的数据将无法恢复,只有数据可用的数据:您将不得不重新导入旧结构中的旧数据。

+0

RAW是替代BLOB的较小值 – 2011-03-14 22:28:46

+0

@Gary:是的,RAW将是VARCHAR列的二进制等价物,我没有想过这一点。不过,我不确定我的建议是使用UTF8 BLOB(或RAW)是一个好主意:) – 2011-03-15 08:29:44

相关问题