我有一个应用程序,可以在其中上传文件并向文件添加元数据。此元数据信息存储在数据库中,但部分添加的信息以某种方式进行编码(遗憾的是我无法访问源代码)。
Oracle 数据库中元数据的原始表示如下:
00000009010000000000000000512005B69801505B000000010000000700000040000000010000000A0100000006496D616765000000003C000000010000000A010000000A696D6167652F706E670000000027000000030000000501000000010000000500000001010000000B64653A3132332E706E6700000002A8000000030000000501000000030000000700000001010000000E737461636B6F766572666C6F770000000042000000010000000A010000001844433078303166363565396420307830303033336433640000000A2600000001000000020100033D3D0000003E000000010000000A0100000021346266653539343939343631356333323861613736313431636337346134353900
而原始序列
737461636B6F766572666C6F77
对应
stackoverflow
查询
select UTL_RAW.CAST_TO_VARCHAR2(<raw_data>) from dual;
返回以下字符串:
此处显示元数据的值。但属性的名称/标识符是不可读的。 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/