从 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 数据,即 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;
首先,您应该避免使用 LONG 数据类型的列并切换到 BLOB(或 CLOB,具体取决于您计划在其中存储的内容)。在您的例子中,因为该列包含图像,所以它是一个 BLOB。
您不能指望 SQL SELECT 声明 return 图像 "as is"(即在屏幕上实际看到该图像)- 您得到的只是是那堆垃圾字符。这是预料之中的,毕竟是二进制文件。
当您使用 TOAD 时,转到模式浏览器,打开 table,查看其数据,右键单击存储图像的列并从菜单中选择 "Export Blobs (Longs, Raws ...)"。按照说明将图像导出到磁盘上的某个文件夹中。
否则,您必须创建一个能够处理 displaying/downloading 个图像的应用程序(例如,使用 Apex)。
如果这不是你想要做的(正如你提到的你想要 "decode" 一个字符串),你能解释一下吗?
我正在尝试从存储图像文件的 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 数据,即 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;
首先,您应该避免使用 LONG 数据类型的列并切换到 BLOB(或 CLOB,具体取决于您计划在其中存储的内容)。在您的例子中,因为该列包含图像,所以它是一个 BLOB。
您不能指望 SQL SELECT 声明 return 图像 "as is"(即在屏幕上实际看到该图像)- 您得到的只是是那堆垃圾字符。这是预料之中的,毕竟是二进制文件。
当您使用 TOAD 时,转到模式浏览器,打开 table,查看其数据,右键单击存储图像的列并从菜单中选择 "Export Blobs (Longs, Raws ...)"。按照说明将图像导出到磁盘上的某个文件夹中。
否则,您必须创建一个能够处理 displaying/downloading 个图像的应用程序(例如,使用 Apex)。
如果这不是你想要做的(正如你提到的你想要 "decode" 一个字符串),你能解释一下吗?