我正在尝试从外部.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;
非常感谢您的关注!
答案 0 :(得分:3)
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;