gpt4 book ai didi

oracle - utl_raw.cast_to_varchar2 不同字符集的行为

转载 作者:行者123 更新时间:2023-12-01 23:34:42 51 4
gpt4 key购买 nike

我正在使用一个名为 pl_fpdf 的 oracle pl/sql pdf 包来动态创建 pdf(这是我目前必须使用的)。它适用于一个数据库,但不适用于另一个数据库。我相信我已经将问题缩小到字符集的差异和 utl_raw.cast_to_varchar2 在尝试将图像二进制文件转换为 ascii (base64) 时的行为。

工作字符集是WE8MSWIN1252,另一个是AL32UTF8(现在似乎更常见了)

我的问题是,如何使 utl_raw.cast_to_varchar2AL32UTF8 的行为与对 WE8MSWIN1252 的行为相同,以便生成的 base64图片数据是否正确?

这是我认为有问题的代码。如果我在这里完全错了,请告诉我。

procedure p_putstream(pData in out NOCOPY blob) is
offset integer := 1;
lv_content_length number := dbms_lob.getlength(pdata);
buf_size integer := 2000;
buf raw(2000);
begin
p_out('stream');
-- read the blob and put it in small pieces in a varchar
while offset < lv_content_length loop
dbms_lob.read(pData,buf_size,offset,buf);
p_out(utl_raw.cast_to_varchar2(buf), false);
offset := offset + buf_size;
end loop;
-- put a CRLF at te end of the blob
p_out(chr(10), false);
p_out('endstream');
exception
when others then
error('p_putstream : '||sqlerrm);
end p_putstream;

最佳答案

什么是p_outdbms_output.put_line 的包装器?

这可能是客户端字符集问题吗?根据utl_raw.cast_to_varchar2 documentation :

“转换为 VARCHAR2 时,当前的全局化支持字符集用于该 VARCHAR2 中的字符。”

例如

$ export NLS_LANG=AMERICAN_AMERICA.UTF8
$ sqlplus
SQL> select utl_raw.cast_to_varchar2('80') from dual;

UTL_RAW.CAST_TO_VARCHAR2('80')
--------------------------------------------------------------------------------


SQL>

但是

$ unset NLS_LANG
$ sqlplus
SQL> select utl_raw.cast_to_varchar2('80') from dual;

UTL_RAW.CAST_TO_VARCHAR2('80')
--------------------------------------------------------------------------------
?

SQL>

当数据库字符集为

SQL> select * from nls_database_parameters where parameter like '%CHARACTERSET';

PARAMETER VALUE
------------------------------ ----------------------------------------
NLS_CHARACTERSET WE8MSWIN1252
NLS_NCHAR_CHARACTERSET AL16UTF16

关于oracle - utl_raw.cast_to_varchar2 不同字符集的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7409662/

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