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

Imr*_*han 5 java oracle jdbc

我有一个表,我们的服务提供商插入UNICODE数据,但我的oracle characterset是WE8ISO8859P1.

现在我得到的数据我使用oracle的功能,但它显示???????

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

更多消息库存是CLOB类型.

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

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

问候,imran

Vin*_*rat 8

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

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

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

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

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