如何在 Oracle 查询中将 CLOB 转换为 UTF8?

How to convert CLOB to UTF8 in an Oracle query?

我有一个带有 CLOB 字段的查询,我想 return 她的值采用 UTF8 格式。例如,如果字段是 varchar,则下一个查询工作正常,但如果它是 CLOB,则 return 不是正确的 UTF8 字符串。

select convert(field, 'AL32UTF8', 'WE8ISO8859P15') from table;

如何从查询中的 CLOB 中 return UTF8 字符串?

使用 dbms_lob 包

例如

select convert(dbms_lob.substr(field,dbms_lob.getlength(field), **0**), 
              'AL32UTF8',
              'WE8ISO8859P15') 
from table;

已修复:

 select convert(dbms_lob.substr(field,dbms_lob.getlength(field)),
              'AL32UTF8',
              'WE8ISO8859P15') 
 from table;

使用DBMS_LOB.CONVERTTOBLOB.

来自 oracle 文档:

Oracle discourages the use of the CONVERT function in the current Oracle Database release. The return value of CONVERT has a character datatype, so it should be either in the database character set or in the national character set, depending on the datatype. Any dest_char_set that is not one of these two character sets is unsupported. …

如果您需要像 CLOB 这样的字符数据类型,其字符集不同于数据库设置时使用的字符数据类型,则应将其转换为 BLOB。 这就是 DBMS_LOB.CONVERTTOBLOB 的用武之地。

如果您需要一个 returns BLOB 的函数,您必须将 CONVERTTOBLOB 包装到您自己的函数中。 例如:

CREATE OR REPLACE FUNCTION clob_to_blob (p_clob CLOB, p_charsetname VARCHAR2)
   RETURN BLOB
AS
   l_lang_ctx      INTEGER := DBMS_LOB.default_lang_ctx;
   l_warning       INTEGER;
   l_dest_offset   NUMBER := 1;
   l_src_offset    NUMBER := 1;
   l_return        BLOB;
BEGIN
   DBMS_LOB.createtemporary (l_return, FALSE);
   DBMS_LOB.converttoblob (
      l_return,
      p_clob,
      DBMS_LOB.lobmaxsize,
      l_dest_offset,
      l_src_offset,
      CASE WHEN p_charsetname IS NOT NULL THEN NLS_CHARSET_ID (p_charsetname) ELSE DBMS_LOB.default_csid END,
      l_lang_ctx,
      l_warning);

   RETURN l_return;
END;

这允许像这样的查询:

SELECT clob_to_blob (field, 'UTF8') FROM t;

要获取字符集名称支持值的列表,请使用:

SELECT *
  FROM v$nls_valid_values
 WHERE parameter = 'CHARACTERSET'