这似乎是因为您仍然使用fopen_nchar打开文件.如果我这样做:
create table t42(str nvarchar2(20));
insert into t42 values ('Hello');
declare
file utl_file.file_type;
l_str nvarchar2(20);
begin
select str into l_str from t42;
file := utl_file.fopen('', 'dummy.dat', 'w', 32767);
utl_file.put_line(file, convert(l_str, 'WE8MSWIN1252', 'AL16UTF16'));
utl_file.fclose(file);
end;
/
…然后我得到一个包含䡥汬的文件,Linux文件命令报告为UTF-8 Unicode文本;记事本显示䡥䡥并说文件是’ANSI as UTF-8′.
如果我将fopen更改为fopen_nchar:
file := utl_file.fopen_nchar('CENSYS_EXPORT_DIR', 'dummy.dat', 'w', 32767);
…然后我得到ORA-29298:字符集不匹配和空文件.
如果我回到fopen但将PL / SQL变量更改为varchar2:
declare
file utl_file.file_type;
l_str varchar2(20);
begin
select str into l_str from t42;
file := utl_file.fopen('', 'dummy.dat', 'w', 32767);
utl_file.put_line(file, convert(l_str, 'WE8MSWIN1252', 'AL16UTF16'));
utl_file.fclose(file);
end;
/
…然后文件包含¿(在vim中),文件报告为ISO-8859文本.但记事本显示߿并说该文件是ANSI.
而不是使用转换,哪个Oracle discourages,你可以通过raw反弹它:
declare
file utl_file.file_type;
l_str varchar2(20);
begin
select str into l_str from t42;
file := utl_file.fopen('', 'dummy.dat', 'w', 32767);
utl_file.put_line(file,
utl_raw.cast_to_varchar2(utl_raw.convert(utl_raw.cast_to_raw(l_str),
'ENGLISH_UNITED KINGDOM.WE8MSWIN1252', 'ENGLISH_UNITED KINGDOM.UTF8')));
utl_file.fclose(file);
end;
/
在显示为Hello的Linux中,文件报告为ASCII文本;记事本也将它显示为Hello,并再次说明该文件是ANSI.我不清楚这是否能让你到达你需要的地方……当然,你可能需要一种不同的语言和语言环境.
但我的数据库字符集是AL32UTF8,我的国家字符集是AL16UTF16,所以你可能会看到不同的行为;如果您的数据库字符集是WE8MSWIN1252,那么该文件也将被创建;从the documentation开始:
UTL_FILE expects that files opened by UTL_FILE.FOPEN in text mode
are encoded in the database character set. It expects that files
opened by UTL_FILE.FOPEN_NCHAR in text mode are encoded in the UTF8 character set.