如何在Oracle中转换列的字符集

时间:2011-03-14 08:25:01

标签: java oracle jdbc

我有一张表,我们的服务提供商在其中插入UNICODE数据,但我的oracle characterset是WE8ISO8859P1。

现在要获取我使用oracle函数的数据,但它显示了???????

从client_campaigns中选择CONVERT(消息,'AL32UTF8','WE8ISO8859P1')

更多消息库存属于CLOB类型。

由于dataloss的原因,我无法更改数据库的字符集,其次是生产和字符集的更改可能会导致错误。

现在请指导我如何将这些数据作为UNICODE获取?

此致 imran

1 个答案:

答案 0 :(得分:8)

插入字符(VARCHAR2或CHAR或CLOB)列的字符串将始终转换为数据库字符集。这意味着在您的情况下插入的数据将转换为WE8ISO8859P1。由于UNICODE不是WE8ISO8859P1的子集,因此您将丢失信息。字符集中的某些字符在插入时会转换为?

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

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

    显然,只有数据库可用的数据才能恢复先前的数据:您必须在新结构中重新导入旧数据。