一个或多个UTF8字段包含非UTF 8数据,编辑可能会产生意外结果

时间:2017-01-03 20:21:00

标签: oracle utf-8 oracle-apex

我在Oracle Linux 7.2上有文本文件(iso-8859-1),我试图在Oracle DB 12.1c(AL32UTF8)上加载表。

     declare
     f       Utl_File.File_Type;
     v_Buffer  varchar2(1000);
     v_Table   Parse.Varchar2_Table;
     v_Nfields integer;
 begin
     f     := Utl_File.Fopen('SA', '1.txt', 'R');
     if Utl_File.Is_Open(f) then
         loop
             begin
                 Utl_File.Get_Line(f, v_Line, 1000);
                 if v_Line is null then
                     exit;
                 end if;
                     Parse.Delimstring_To_Table(v_Line, v_Table, v_Nfields, Chr(9));
                     --insert into ...
                 end if;
             exception
                 when No_Data_Found then
                     exit;
             end;
         end loop;
     end if;
     Utl_File.Fclose(f);
 end;

使用this解析

我在pl / sql开发人员中输出了漂亮(正确)的消息"一个或多个UTF8字段包含非UTF 8数据,编辑可能会产生意外结果"

correct image

和Apex 5中的输出不正确。

apex image

我可以用这个做点什么吗?我转发?在甲骨文和更多...翻译...

更新1

select *
  from nls_database_parameters
 where parameter like '%CHARACTERSET%';

PARAMETER               VALUE
NLS_NCHAR_CHARACTERSET  AL16UTF16
NLS_CHARACTERSET        AL32UTF8

1 个答案:

答案 0 :(得分:1)

UTL_FILE documentation

  

UTL_FILE期望UTL_FILE.FOPEN在文本模式下打开的文件在数据库字符集中进行编码。

显然事实并非如此。

使用DBMS_LOB.OPEN()打开一个BFILE(请参阅BFILENAME)作为RAW值,并使用UTL_I18N.RAW_TO_CHAR()函数将其转换为VARCHAR2。

然后,您可以使用Parse.Delimstring_To_Table函数来解析行。

考虑使用EXTERNAL TABLESQL*Loader,也许它们更容易使用。