Dea*_*sus 4 oracle plsql character-encoding
几天来我一直在做这件事,这让我发疯了.
我有一个oracle程序,用于编写文件UTL_FILE.我曾经将我的值存储为NVARCHAR2并使用UTL_FILE.PUT_LINE_NCHAR过程编写我的文件,并将文件写入(notepad ++认为是)UTF8.
然后该文件被另一个程序使用,问题是所述程序使用WE8MSWIN1252读取它,我无法改变它,因为它是遗留代码.
所以我尝试使用UTL_FILE.PUT_LINE过程,但该文件仍被视为UTF8.我在oracle的文档中看到NVARCHAR2使用了国家字符集(我的是AL16UTF16),所以我尝试使用这样的CONVERT方法:
CONVERT(whatIWantToWrite, 'WE8MSWIN1252', 'AL16UTF16'))
Run Code Online (Sandbox Code Playgroud)
它引发了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, 'WE8MSWIN1252', 'AL16UTF16'));
utl_file.fclose(file);
end;
/
Run Code Online (Sandbox Code Playgroud)
...然后我得到一个包含的文件䡥汬,Linux file命令报告为UTF-8 Unicode text; Notepad ++显示??并说文件是'ANSI as UTF-8'.
如果我fopen改为fopen_nchar:
file := utl_file.fopen_nchar('CENSYS_EXPORT_DIR', 'dummy.dat', 'w', 32767);
Run Code Online (Sandbox Code Playgroud)
...然后我得到ORA-29298: Character set mismatch一个空文件.
如果我回去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>', 'dummy.dat', 'w', 32767);
utl_file.put_line(file, convert(l_str, 'WE8MSWIN1252', 'AL16UTF16'));
utl_file.fclose(file);
end;
/
Run Code Online (Sandbox Code Playgroud)
...然后文件包含¿¿(in vim),文件报告为ISO-8859 text.但Notepad ++显示?并说该文件是ANSI.
而不是使用convert,Oracle 不鼓励,你可以通过raw反弹它:
declare
file utl_file.file_type;
l_str varchar2(20);
begin
select str into l_str from t42;
file := utl_file.fopen('<directory>', '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;
/
Run Code Online (Sandbox Code Playgroud)
在显示为的Linux中,Hello文件报告为ASCII text; Notepad ++也显示它Hello,并再次说该文件是ANSI.我不清楚这是否能让你到达你需要的地方......当然,你可能需要一种不同的语言和语言环境.
但我的数据库字符集是AL32UTF8,我的国家字符集是AL16UTF16,所以你可能会看到不同的行为; 如果您的数据库字符集是WE8MSWIN1252,那么该文件也将被创建; 从文件:
UTL_FILE期望UTL_FILE.FOPEN以文本模式打开的文件在数据库字符集中编码.它期望UTL_FILE.FOPEN_NCHAR在文本模式下打开的文件以UTF8字符集编码.
| 归档时间: |
|
| 查看次数: |
23854 次 |
| 最近记录: |