微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

oracle – UTL_FILE和字符集

几天来我一直在做这件事,这让我发疯了.
我有一个使用UTL_FILE编写文件的oracle过程.
我以前将我的值存储为NVARCHAR2并使用UTL_FILE.PUT_LINE_NCHAR过程编写我的文件,并将文件写入(记事本认为是)UTF8.
然后该文件被另一个程序使用,问题是所述程序使用WE8MSWIN1252读取它,我无法改变它,因为它是遗留代码.
所以我尝试使用UTL_FILE.PUT_LINE过程,但该文件仍被视为UTF8.
我在oracle的文档中看到NVARCHAR2使用了国家字符集(我的是AL16UTF16),所以我尝试使用CONVERT方法,如下所示:

CONVERT(whatIWantToWrite,'WE8MSWIN1252','AL16UTF16'))

它引发了ORA-29298字符集不匹配异常.
我不明白,我的NLS_NCHAR_CHaraCTERSET是AL16UTF16为什么我不能将它转换为WE8MSWIN1252?
有没有其他方法可以使用WE8MSWIN1252写入文件

解决方法

这似乎是因为您仍然使用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('<directory>','dummy.dat','w',32767);
  utl_file.put_line(file,convert(l_str,'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',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('<directory>','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('<directory>',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.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐