从oracle中的LONG数据列读取数据会给出替换字符���

时间:2018-01-09 09:39:17

标签: oracle toad clob

我正在尝试从Oracle中的LONG列读取数据,该列存储了一个Image文件。这样做我得到以下: IL 39 32130580�3�10059�� \ 0 \ u0010JFIF \ 0 \ U0001 \ U0001 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0℃\ 0 \ B \ u0006 \ u0006 \

我认为问号不允许我解码字符串。 这些What是什么意思?

谢谢,

2 个答案:

答案 0 :(得分:1)

通常,您根本不应使用LONG数据类型。多年来deprecated

除此之外,数据类型LONG用于文字数据,例如VARCAHR2CLOB。您不能将它用于图像等二进制数据。

根据评论进行更新

尝试此功能将LONG转换为BLOB - 祝您好运!

CREATE OR REPLACE FUNCTION ConvertLONG(InChar IN LONG) RETURN BLOB IS

    dest_lob BLOB;  
    lang_context INTEGER := DBMS_LOB.DEFAULT_LANG_CTX;
    dest_offset INTEGER := 1;
    src_offset INTEGER := 1;
    read_offset INTEGER := 1;
    warning INTEGER;

BEGIN

    DBMS_LOB.CREATETEMPORARY(dest_lob, TRUE);
    DBMS_LOB.CONVERTTOBLOB(dest_lob, TO_LOB(InChar), DBMS_LOB.LOBMAXSIZE, dest_offset, src_offset, DBMS_LOB.DEFAULT_CSID, lang_context, warning);
    RETURN dest_lob;

END;

答案 1 :(得分:0)

首先,您应该避免使用LONG数据类型列并切换到BLOB(或CLOB,具体取决于您计划存储在那里的内容)。在您的情况下,由于该列包含图像,这将是一个BLOB。

您不能期望SQL SELECT语句返回图像"按原样#34; (即实际上在屏幕上看到那个图像) - 你得到的就是那堆垃圾字符。毕竟,这是一个二进制文件。

当您使用TOAD时,转到模式浏览器,打开该表,查看其数据,右键单击存储图像的列,然后选择"导出Blob(Longs,Raws ...)"从菜单中。按照说明将图像导出到磁盘上的某个文件夹中。

否则,您必须创建一个能够显示/下载图像的应用程序(例如,使用Apex)。

如果那不是你想要做的(正如你提到的那样,你想要"解码"一个字符串),你能解释一下吗?