Oracle:从外部源插入捷克字符

时间:2014-01-30 08:52:04

标签: oracle unicode

我正在尝试从外部.csv中将捷克字符插入我的数据库。

如果我直接在工作表中打印单词“Sedláček”中的unicode,我会获得“Sedl \ 00E1 \ 010Dek”。但是,如果我打印从.csv导入的同一个单词,我有“Sedl \ 00C3 \ 00A1 \ 00C4 \ 008Dek”,它在我的数据库中提供“SedláÄek”。

为什么会有所不同?我怎样才能从.csv获得正确的单词?

这是我的导入代码:

set serveroutput on;

CREATE OR REPLACE DIRECTORY MYREP as '/foo';

DECLARE
    f utl_file.file_type;
    v_line NVARCHAR2(1000);

BEGIN
f := utl_file.fopen ('MYREP', 'toto.csv', 'R');
    IF utl_file.is_open(f) THEN
      LOOP
          utl_file.get_line(f, v_line, 1000);
          dbms_output.put_line(ASCIISTR(v_line));
      END LOOP;
    END IF;
utl_file.fclose(f);
END;

并在我的工作表中:

set serveroutput on

BEGIN
   dbms_output.put_line(ASCIISTR('Sedláček')); 
END;

非常感谢您的关注!

1 个答案:

答案 0 :(得分:3)

来自documentation for UTL_FILE

  

UTL_FILE期望UTL_FILE.FOPEN以文本模式打开文件   在数据库字符集中编码。它期望文件   在文本模式下由UTL_FILE.FOPEN_NCHAR打开的编码在UTF8中   字符集。如果打开的文件未按预期编码   字符集,尝试读取文件的结果是   不确定的。

您使用nvarchar2变量表示您需要使用国家字符集,因此您需要使用FOPEN_NCHAR function打开文件,并使用FOPEN.GET_LINE_NCHAR procedure来读取它

BEGIN
    f := utl_file.fopen_nchar('MYREP', 'toto.csv', 'R');
    IF utl_file.is_open(f) THEN
      LOOP
          utl_file.get_line_nchar(f, v_line, 1000);
          dbms_output.put_line(ASCIISTR(v_line));
      END LOOP;
    END IF;
    utl_file.fclose(f);
END;