设为首页 - 加入收藏 PHP编程网 - PHP站长网 (http://www.52php.cn)- 电商,百科,编程,业界,移动互联,5G,云计算,站长网!
热搜: 专业 娱乐 applewat 服务
当前位置: 首页 > 站长百科 > 正文

oracle – UTL_FILE和字符集

发布时间:2021-01-24 12:14 所属栏目:[站长百科] 来源:网络整理
导读:几天来我一直在做这件事,这让我发疯了. 我有一个使用UTL_FILE编写文件的oracle过程. 我以前将我的值存储为NVARCHAR2并使用UTL_FILE.PUT_LINE_NCHAR过程编写我的文件,并将文件写入(记事本认为是)UTF8. 然后该文件被另一个程序使用,问题是所述程序使用WE8MSW

几天来我一直在做这件事,这让我发疯了.
我有一个使用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.

【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

推荐文章
热点阅读