Oracle導出的文件爲何用Excel打開是亂碼?

Oracle導出的文件爲何用Excel打開是亂碼?sql

 

1 問題現象數據庫

Oracle字符集是AL32UTF8,查詢表中的非英文字符顯示正常,可是用utl_file寫到CSV文件用Excel打開是亂碼。微信

 

2 問題分析oop

首先能夠確定:測試

1utl_file寫文件是按照二進制輸出,不會改變數據的編碼,它不受環境變量NLS_LANG控制。fetch

2)數據庫中的數據是正常的。編碼

 

那麼,Excel錯誤極可能是Excel自己的問題,測試下用Notepad++打開文件,顯示正常,顯示格式爲UTF8BOM格式。spa

若是用Notepad++把文件轉換成UTF8格式,即加上BOM,再用Excel打開就是正常的了。.net

 

這說明,Excel不能自動識別UTF8BOM格式,而utl_file寫文件又不會自動寫入BOM頭(EFBBBF),從而致使了亂碼。get

 

3 解決方案

若是須要utl_file導出的UTF8格式的文件用Excel打開沒有亂碼,能夠在文件頭加上BOM,在Oracle中能夠用chr(15711167)表示。示例代碼以下:

 

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;

 

 


本文分享自微信公衆號 - 微光點亮星辰(SandTower)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索