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

我有一个表,服务提供者在其中插入UNICODE数据,但我的Oracle字符集为WE8ISO8859P1。

现在,要获取该数据,我使用了以下oracle功能,但它正在显示???????

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

消息库的另一件事是CLOB类型。

由于数据丢失,我无法更改数据库的字符集,其第二次投入生产,并且字符集的更改可能会导致错误。

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

问候,
伊姆兰

参考方案

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

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

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

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

    Java:在PreparedStatement(JDBC)中将null传递为long - java

    我有一个变量是Long val = null; 而且我正在寻找一种将其传递给PreparedStatement语句对象的方法,以便将数据库中的字段值设置为null。statement.setLong(1,val); 它对Long无效,而对Long则无效。任何输入的想法或建议。谢谢 !!! 参考方案 您应该使用setNull method。statement.…

    JDBC ResultSet总行 - java

    我正在我的应用程序中实现分页。为此,我运行查询并获取ResultSet。现在,我想获得此ResultSet中用于分页计算的记录总数。我怎么能得到这个?我不想执行额外的SQL,而这会给我总行数。 参考方案 另一个选择是将计数聚合添加为查询中的子查询列。如果您的数据库有点聪明,它将只执行一次。您应该能够使用自己喜欢的数据库中的查询分析器轻松地检查这一点。SELE…

    Java:正则表达式模式匹配器是否有大小限制? - java

    我的模式类似于OR:“word1 | word2 | word3”我大约有800个字。可能有问题吗? 参考方案 您仅受记忆和理智的限制。 :)

    Java:线程池如何将线程映射到可运行对象 - java

    试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …

    Java:我可以在Hashmaps中使用数组吗? - java

    我可以在Hashmaps中使用数组吗?如果是这样,则声明这种哈希图的确切语法是什么?谢谢 参考方案 数组也是对象。甚至像int[]这样的原始数组。Map<String,String[]> map = new HashMap<String,String[]>();