【发布时间】:2018-08-29 09:12:52
【问题描述】:
我们有一些 lob 和 varchar2 类型的数据被错误地编码为 AL32UTF8,我们需要将其编码转换为 we8mswin1252 字符集。 我得到了用于字符集转换的转换函数,该函数在 varchar2 数据类型上运行良好,但在与 CLOB 一起使用时会给出一些模糊字符。 我当前的编码是 AL32UTF8。
select value,CONVERT(value,'we8mswin1252','AL32UTF8'),CONVERT(to_clob(value),'we8mswin1252','AL32UTF8') from temp;
数据库:Oracle 12c
select * from nls_database_parameters where parameter like '%CHARACTERSET%';
【问题讨论】:
-
您的数据库和国家字符集是什么? documentation 提到了转换功能的限制。
-
@alex 用所需的详细信息更新了问题。我使用的是 Oracle 12c,nls 字符集是 NLS_NCHAR_CHARACTERSET => AL16UTF16 NLS_CHARACTERSET => AL32UTF8
-
然后正如文档所说,“不支持这两个字符集之一的任何 dest_char_set。”我不认为任何其他方法直接支持 CLOB。您可能必须将您的 CLOB 切割成 varchar2 块,转换它们,然后将它们重新组合在一起?
-
正如您在值列中看到的那样,所有字符都是纯英文字符,除了“-”是一个特殊字符,该字符在两种编码中都可用,我不明白为什么它将所有字符转换为模糊字符,而不是仅替换该特殊字符。
-
它仍在尝试将每个字符从一个字符集转换为另一个字符集。我不知道为什么它(现在)适用于 varchar2 但不适用于具有特殊字符集组合的 CLOB;但是由于您正在做的事情不受支持,我不确定这是否重要。此外,从 MoS doc 1628060.1 和其他地方,“技术上可能,但不受支持,将 NLS_CHARACTERSET 中未定义的数据/语言/字符存储在 CHAR、VARCHAR2、LONG 或 CLOB 数据类型中。”您的出发点,即您的数据编码错误,听起来不正确。另见文档 158577.1。