oracle用哪个字符集,oracle – UTL_FILE和字符集

这似乎是因为您仍然使用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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值