【发布时间】:2021-11-12 13:31:38
【问题描述】:
我正在从事一个从 API 获取 base 64 图像的项目,我想将它作为图像 (BLOB) 存储在 Oracle 表中。这是我试图做的,但它当然没有用:
// The real image64 String is around 40k of length
String image64 = "/9j/4AAQSkZJRgABAQAAAQABAAD......RzUUUBB2UtRREOFFFFpa//Z";
Statement stmt = connection.createStatement();
stmt.executeQuery("INSERT INTO INFO (IMAGE) VALUES (TO_BLOB('"+image64+"'))");
我得到的错误是:
java.sql.SQLException: ORA-01704 String literal too long
现在,我知道一种解决方法是将字符串分成块并像这样插入:
INSERT INTO INFO (IMAGE) VALUES (TO_BLOB('"+chunk1+"') || (TO_BLOB('"+chunk2+"') || ...))
我也尝试过这样做。但是,就像我在第一个代码 sn-p 中评论的那样,字符串的长度约为 40k,所以当我尝试将它分成 4000 个字符的块时,由于某种原因,命令(真的,真的很长)是没有完全发送。它突然结束,就像我溢出了 String 类型的容量什么的。
这是我发送的:
INSERT INTO INFO (IMAGE) VALUES (
TO_BLOB('/9jGOL5K...really long string...MdlNjgx45ouz')
|| TO_BLOB('U1hNR...really long string...95hcktXXLHV0uOW5tSQV')
|| TO_BLOB('RcB7Z...really long string...S6P4mGN3eXny6trpcI4X')
|| TO_BLOB('eOy4n...really long string...MrS06QOZ8Su2Tl8hjxH1')
|| TO_BLOB('7SNrA...really long string...TmyBzdiC2ye8drBNWaPi')
|| TO_BLOB('H1rnk...really long string...O5dqJ86r6bIxwxxf0bA3')
|| TO_BLOB('TxS0N...really long string...ZOT+7A9w+QVjZGvbqY15')
|| TO_BLOB('eHEiR...really long string...Lm3ECxuzQ9xdbiNtQBJ6')
|| TO_BLOB('o8Kjj...really long string...eDR1FqywLLlukprsXFk7')
|| TO_BLOB('ALzL/...really long string...PC6nmNf6Ip+vL4beqAF8')
)
这就是服务器得到的(根据 Navicat 11.0.8):
INSERT INTO INFO (IMAGE) VALUES (
TO_BLOB('/9jGOL5K...really long string...MdlNjgx45ouz')
|| TO_BLOB('U1hNRwniiRW6rdyXZz8QSQulYBqYO95
如您所见,它几乎没有进入第二块。难怪我得到这个错误:
[Err] ORA-00933: command not properly ended
我真的不知道该如何处理。我尝试做同样的事情,但用 CLOB 代替,没有任何改变。想法?我知道 oracle.sql.BLOB 包中有一个 BLOB 类型,但是我不明白如何使用它,也不知道如何通过阅读文档来存储它。
想法?
【问题讨论】:
-
出于这样的原因将图像存储在数据库中通常不是一个好主意。考虑在您自己的代码中进行转换并从那里插入二进制数据?
-
是的,我看到了一些关于将其转换为二进制的内容,但我不知道如何编写代码……我看到的示例不清楚
-
你输入的数据是BASE64字符串还是二进制数据?要将 CLOB/BASE64 字符串转换为 BLOB 并返回,请参阅stackoverflow.com/questions/42085147/…
标签: java sql oracle blob blobstorage