无法解码来自Oracle RAW数据的所有信息

时间:2018-08-14 10:00:55

标签: 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类型)

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

2 个答案:

答案 0 :(得分:0)

RAW列并不总是包含字符串,因为结果看起来内容是二进制数据,更确切地说是jpg文件,其中包含字符串标题,但包含二进制信息。 将其转换为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”或任何其他文本,因为您将仅获得一个十六进制值序列。 然后,您需要从程序中将其转换为二进制/图像并对其进行正确处理。

答案 1 :(得分:0)

“ A01”和“ 101”都用于开头4字节长,后跟文本,该文本以null结尾

00000009 010000000000000000512005B69801505B000000010000000700000040000000010000000A01
00000006 496D61676500                   Image

0000003C 000000010000000A01
0000000A 696D6167652F706E6700           image/png

00000027 00000003000000050100000001000000050000000101
0000000B 64653A3132332E706E6700         de:123.png

000002A8 00000003000000050100000003000000070000000101
0000000E 737461636B6F766572666C6F7700   stackoverflow

00000042 000000010000000A01
00000018 444330783031663635653964203078303030333364336400
          D C 0 x 0 1 f 6 5 e 9 d   0 x 0 0 0 3 3 d 3 d

00000A26 00000001000000020100033D3D0000003E000000010000000A01
00000021 346266653539343939343631356333323861613736313431636337346134353900
          4 b f e 5 9 4 9 9 4 6 1 5 c 3 2 8 a a 7 6 1 4 1 c c 7 4 a 4 5 9