oracle – UTL_FILE和字符集
几天来我一直在做这件事,这让我发疯了.
CONVERT(whatIWantToWrite,'WE8MSWIN1252','AL16UTF16')) 它引发了ORA-29298字符集不匹配异常. 解决方法这似乎是因为您仍然使用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开始:
(编辑:西安站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |