转换函数不适用于 CLOB 数据类型

Posted

技术标签:

【中文标题】转换函数不适用于 CLOB 数据类型【英文标题】:Convert function not working with CLOB datatype 【发布时间】: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。 【参考方案1】:

我从甲骨文得到的答案: “CONVERT 函数是一个遗留函数,不应用于任何与应用程序相关的字符集转换。 CLOB 特别棘手,因为它在多字节数据库中使用了一种特殊的存储编码,例如 AL32UTF8。 CONVERT 仅对某些修复任务有用。 处理数据库字符集以外的字符集数据的支持方式是使用 RAW 数据类型和 UTL_I18N 包中的转换过程。但是,UTL_I18N 不支持 CLOB。因此,您必须以 32K 块读取 CLOB,使用 UTL_I18N.STRING_TO_RAW 将它们转换为 WE8MSWIN1252,进行后处理并使用 UTL_FILE.PUT_RAW 写入文件。”

我还有另一个 unix 命令 iconv 可以转换文件编码,所以基本上我正在将 db 输出写入文件,因此转换了它的编码并传输了数据。

谢谢

【讨论】:

以上是关于转换函数不适用于 CLOB 数据类型的主要内容,如果未能解决你的问题,请参考以下文章

UPDATEXML 抛出 SQL 错误:ORA-00927:尝试转换和更新 CLOB 数据类型时缺少等号

oracle数据库CLOB类型怎么转换为String

oracle中 怎么把字符串的数据insert 到 clob类型的字段中

房间数据库的类型转换器不适用于具有来自另一个类的对象的类

JPA Entity CLOB 列用于测试的不同数据类型

java Clob类型 转String