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

Reading data from LONG data column in oracle gives Replacement Characters ���

我正在尝试从存储图像文件的 Oracle 中的 LONG 列中读取数据。这样做时,我得到以下信息: IL 39 321 30580� 3� 10 0 59� ����[=16=]\u0010JFIF[=16=]\u0001\u0001[=16=][=16=][=16=][=16=][=16=][=16=][=16=]��[=17=]C[=17=]\b\u0006\u0006\

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

谢谢,

一般来说,你根本不应该使用 LONG 数据类型。已经 deprecated 好久了。

除此之外,数据类型 LONG 用于 text 数据,即 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;

首先,您应该避免使用 LONG 数据类型的列并切换到 BLOB(或 CLOB,具体取决于您计划在其中存储的内容)。在您的例子中,因为该列包含图像,所以它是一个 BLOB。

您不能指望 SQL SELECT 声明 return 图像 "as is"(即在屏幕上实际看到该图像)- 您得到的只是是那堆垃圾字符。这是预料之中的,毕竟是二进制文件。

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

否则,您必须创建一个能够处理 displaying/downloading 个图像的应用程序(例如,使用 Apex)。

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