前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Oracle导出的文件为什么用Excel打开是乱码?

Oracle导出的文件为什么用Excel打开是乱码?

作者头像
一头小山猪
发布2020-04-10 16:23:37
2.2K0
发布2020-04-10 16:23:37
举报
文章被收录于专栏:微光点亮星辰微光点亮星辰

Oracle导出的文件为什么用Excel打开是乱码?

1 问题现象

Oracle字符集是AL32UTF8,查询表中的非英文字符显示正常,但是用utl_file写到CSV文件用Excel打开是乱码。

2 问题分析

首先可以肯定:

(1)utl_file写文件是按照二进制输出,不会改变数据的编码,它不受环境变量NLS_LANG控制。

(2)数据库中的数据是正常的。

那么,Excel错误很可能是Excel本身的问题,测试下用Notepad++打开文件,显示正常,显示格式为UTF8无BOM格式。

如果用Notepad++把文件转换成UTF8格式,即加上BOM,再用Excel打开就是正常的了。

这说明,Excel不能自动识别UTF8无BOM格式,而utl_file写文件又不会自动写入BOM头(EFBBBF),从而导致了乱码。

3 解决方案

如果需要utl_file导出的UTF8格式的文件用Excel打开没有乱码,可以在文件头加上BOM,在Oracle中可以用chr(15711167)表示。示例代码如下:

代码语言:javascript
复制
create or replace proceduref_exportdata_ronghe_201209
(
 str_in_sql in varchar2,
 str_in_filename in varchar2,
 str_o_error out varchar2,
 i_o_result out integer
)
as
cur_l_result pkg_type.refcur;
str_l_revord varchar2(4000);
v_file_handle utl_file.file_type;
begin
v_file_handle := utl_file.fopen(‘DATA_POMP_DIR’,str_in_filename, ‘W’);
i_o_result := 1;
utl_file.put(v_file_handle,chr(15711167));
open cur_l_result for str_in_sql;
loop
fetch cur_l_result intostr_l_record;
exit when cur_l_result % notfound;
utl_file.put_line(v_file_handle,str_l_record);
end loop;
close cur_l_result;
utl_file.fclose(v_file_handle);
return;
exception
when others then
str_o_error := substr(sqlerrm, 1,2000);
i_o_result := 0;
return;
end f_exportdata_ronghe_201209;
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-07-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微光点亮星辰 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档