gpt4 book ai didi

oracle - UTL_FILE 和字符集

转载 作者:行者123 更新时间:2023-12-05 00:26:32 28 4
gpt4 key购买 nike

我已经研究这件事好几天了,这让我发疯了。
我有一个使用 UTL_FILE 写入文件的 oracle 程序.
我曾经将我的值存储为 NVARCHAR2 并使用 UTL_FILE.PUT_LINE_NCHAR 写入我的文件程序,它用( Notepad++ 认为是)UTF8写入文件。
然后该文件被另一个程序使用,问题是该程序使用 WE8MSWIN1252 读取它,我无法更改它,因为它是遗留代码。
所以我尝试使用 UTL_FILE.PUT_LINE程序,但该文件仍被视为 UTF8。
我在 oracle 的文档中看到 NVARCHAR2使用了国家字符集(我的是 AL16UTF16),所以我尝试使用 CONVERT像这样的方法:

CONVERT(whatIWantToWrite, 'WE8MSWIN1252', 'AL16UTF16'))

它引发了 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;
/

...然后我得到一个包含 䡥汬 的文件,其中 Linux file命令报告为 UTF-8 Unicode text ; Notepad++ 显示 䡥汬并说该文件是“ANSI as UTF-8”。

如果我更改 fopenfopen_nchar :
  file := utl_file.fopen_nchar('CENSYS_EXPORT_DIR', 'dummy.dat', 'w', 32767);

...然后我得到 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;
/

... 那么文件包含 ¿¿ (在 vim 中)并且文件报告为 ISO-8859 text .但是 Notepad++ 显示 ߿并说该文件是ANSI。

而不是使用 convert , 其中 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>', '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;
/

在 Linux 中显示为 Hello并且文件被报告为 ASCII text ; Notepad++ 显示为 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.

关于oracle - UTL_FILE 和字符集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22040903/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com