从oracle中的长数据列读取数据会产生替换字符���

从oracle中的长数据列读取数据会产生替换字符���,oracle,toad,clob,Oracle,Toad,Clob,我试图从Oracle中存储图像文件的长列中读取数据。这样做时,我得到了以下信息: IL 39 321 30580� 3.� 10 0 59�� ����\0\u0010JFIF\0\u0001\u0001\0\0\0\0\0\0\0��\0C\0\b\u0006\u0006\ 我想问号不允许我解码字符串。 这些是什么意思�� ? 谢谢,一般来说,您根本不应该使用长数据类型。这是很久以前的事了 除此之外,数据类型LONG用于文本数据,如VARCAHR2或CLOB。不能将其用于图像等二进制数据 根据

我试图从Oracle中存储图像文件的长列中读取数据。这样做时,我得到了以下信息: IL 39 321 30580� 3.� 10 0 59�� ����\0\u0010JFIF\0\u0001\u0001\0\0\0\0\0\0\0��\0C\0\b\u0006\u0006\

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


谢谢,

一般来说,您根本不应该使用长数据类型。这是很久以前的事了

除此之外,数据类型LONG用于文本数据,如VARCAHR2或CLOB。不能将其用于图像等二进制数据

根据评论更新

尝试此函数将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;

首先,您应该避免使用长数据类型列,并根据您计划在其中存储的内容切换到BLOB或CLOB。在您的例子中,由于该列包含图像,因此这将是一个BLOB

您不能期望SQL SELECT语句按原样返回一个图像,即在屏幕上实际看到该图像-您得到的只是那堆垃圾字符。这是意料之中的,毕竟它是一个二进制文件

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

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


如果你不想像你提到的那样解码一个字符串,你能解释一下吗?

在我看来,也许可以长时间存储图像,因为我们可以将图像转换为base64编码,然后再存储,不是吗,但是,您的字符串将是纯ASCII,甚至更少,并且永远不会显示任何替换字符或空格。base64编码的主要目的是将任意二进制数据存储为纯文本。显然,你的数据不是这样的。是的,这是真的。但在我的例子中,我试图将长列中的数据转换为图像。oracle数据库非常旧。事实上,图像存储在这里的一个长列中。要是在场的人物没有像我这样乱七八糟就好了�� ���� 这样,我就可以将它们转换为有效的Base64,然后再转换为图像。你知道为什么这些角色会出现吗�� ���� ?事实上,这些数据并没有被编码为base64-接受它!也许应用程序将二进制数据存储为文本。数据库的字符集是什么?NLS_字符集是US7ASCIIBy decode我的意思是,我尝试将长列中的字符串转换为base64格式,然后尝试将base64字符串转换为图像。例如,此网站允许将base64转换为图像。但为了做到这一点,长列中的字符串必须是无乱码的。我得到了像这样的角色�� ���� 我认为这是我转换到base64不能生成有效图像的主要原因。