database - 无法解码 Oracle RAW 数据中的所有信息

标签 database oracle metadata decoding raw-data

我有一个应用程序,可以在其中上传文件并向文件添加元数据。此元数据信息存储在数据库中,但部分添加的信息以某种方式进行编码(遗憾的是我无法访问源代码)。

Oracle 数据库中元数据的原始表示如下:

00000009010000000000000000512005B69801505B000000010000000700000040000000010000000A0100000006496D616765000000003C000000010000000A010000000A696D6167652F706E670000000027000000030000000501000000010000000500000001010000000B64653A3132332E706E6700000002A8000000030000000501000000030000000700000001010000000E737461636B6F766572666C6F770000000042000000010000000A010000001844433078303166363565396420307830303033336433640000000A2600000001000000020100033D3D0000003E000000010000000A0100000021346266653539343939343631356333323861613736313431636337346134353900

而原始序列

737461636B6F766572666C6F77

对应

stackoverflow

查询 select UTL_RAW.CAST_TO_VARCHAR2(<raw_data>) from dual;

返回以下字符串:

CASTTOVARCHAR2

此处显示元数据的值。但属性的名称/标识符是不可读的。 stackoverflow对应的名称/标识符应该是test或包含 test 的表的外键。其他数据包含有关文件的附加信息(如校验和、标题或 MIME 类型)

是否可以从原始字符串中检索不可读的数据(标识符)?

最佳答案

RAW 列并不总是包含字符串,因为结果看起来内容是二进制数据,更准确地说是一个 jpg 文件,其中包含字符串 header ,但在二进制信息中。 将其转换为 varchar 将生成表示为矩形框的无效字符代码。 您在这里使用 varchar 所做的操作相当于使用记事本打开二进制文件,即 winword.doc 甚至 .jpeg。

为了能够获取内容,您需要将其视为图像,而不是 varchar。

您可以使用 PLSQL 获取 jpg 文件,如下所述: http://www.dba-oracle.com/t_extract_jpg_image_photo_sql_file.htm

最终可以使用以下方法以 char 数据类型获取所有内容而不会丢失:

select RAWTOHEX(<raw_data>) from dual;

这会将整个内容作为包含其十六进制等效值的字符值返回,并且不应显示任何用矩形框表示的无效 ANSI 字符。 事实上,您将无法再阅读“stackoverflow”或任何其他文本,因为您只会获得一系列十六进制值。 然后,您需要从程序中将其转换为二进制/图像并正确处理它。

关于database - 无法解码 Oracle RAW 数据中的所有信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51838798/

相关文章:

php - SQL 搜索查询多次显示相同的结果,尽管在我的数据库中仅出现一次

mysql - 如何避免包含空值或零值的列

database - 存储频繁请求的具有关系的键值数据的有效方法?

MySQL:如果表X中的选择为空,则在表Y中选择

sql - HH :MM:SS 中的 Oracle SQL 时间差

java - 如何在 Oracle 10g Java VM 中设置并发调用

oracle - PL/SQL异常处理-函数返回无值

azure - 从 cordova 客户端将文件和元数据上传到 azure blob 存储

MySQL - 查询平均行长度

javascript - 为什么 queryAsync() 会导致添加元数据?