我有一个应用程序,可以在其中上传文件并将元数据添加到文件中。此元数据信息存储在数据库中,但是部分添加的信息以某种方式进行了编码(很遗憾,我无法访问源代码)。
Oracle数据库中元数据的原始表示如下:
00000009010000000000000000512005B69801505B000000010000000700000040000000010000000A0100000006496D616765000000003C000000010000000A010000000A696D6167652F706E670000000027000000030000000501000000010000000500000001010000000B64653A3132332E706E6700000002A8000000030000000501000000030000000700000001010000000E737461636B6F766572666C6F770000000042000000010000000A010000001844433078303166363565396420307830303033336433640000000A2600000001000000020100033D3D0000003E000000010000000A0100000021346266653539343939343631356333323861613736313431636337346134353900
原始顺序
737461636B6F766572666C6F77
对应于
stackoverflow
查询
select UTL_RAW.CAST_TO_VARCHAR2(<raw_data>) from dual;
返回下面的字符串:
此处显示了元数据的值。但是属性的名称/标识符不可读。 stackoverflow
的对应名称/标识符应为test
或包含test
的表的外键。其他数据包含有关文件的其他信息(例如校验和,标题或mime类型)
是否可以从原始字符串中检索无法读取的数据(标识符)?
答案 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