Firebird 的 blob 大小是不是只有 32kb?

Posted

技术标签:

【中文标题】Firebird 的 blob 大小是不是只有 32kb?【英文标题】:Is Firebird's blob size is only 32kb?Firebird 的 blob 大小是否只有 32kb? 【发布时间】:2021-03-25 06:30:07 【问题描述】:

我有一个带有 blob 字段的 Firebird 数据库,用于 base64 格式的图片。如果我尝试上传大小超过 32kb 的编码图片,则会出现异常:

org.firebirdsql.jdbc.FBSQLException:GDS 异常。 335544569. 动态 SQL 错误 SQL 错误代码 = -104 未找到代码 336397331 的消息。

这意味着 X 字节的字符串文字超过了 Y 字节的最大长度。 Firebird 的 blob 真的那么小吗?例如,我需要为 mysql 更改数据库吗?我既没有时间也没有 php 知识来为图片创建后端 api。

【问题讨论】:

Blob 可以是任意长度,但 Blob 不是字符串文字。您听起来像是使用脆弱的字符串拼接(您无法确定日期/时间/浮点数等数据类型表示)和危险(注入)。这是不正常的。使用参数。 bobby-tables.com/php 另外,为什么要将图片膨胀成大的base64数据?只需按原样存储它们,二进制。 【参考方案1】:

Firebird 中的 Blob 可以远大于 32 KB。根据数据库的页面大小,maximum size of a single blob 可以达到略小于 4GB(页面大小 4096)或大于 128GB(页面大小 16384)。

问题在于 - 听起来 - 您通过将值连接到查询字符串而不是使用参数来构造查询。将值连接到查询字符串中是不安全的(它使您容易受到 SQL 注入的攻击),但在这种情况下,您也会遇到硬限制。在 Firebird 中,字符串文字被限制为 32 KB(或 - 因为 Firebird 分配给 blob 时为 3 - 64 KB(实际上是 64kb - 3))。

如果你想分配更大的值,你必须使用带参数的预处理语句。例如(注意:我发布的是 Java 代码,因为您在问题中发布的错误是由 Firebird 的 JDBC 驱动程序(用于 Java)Jaybird 产生的):

try (var pstmt = connection.prepareStatement("insert into images (filename, blobdata) values (?, ?)")) 
    pstmt.setString(1, "filename.jpg");
    pstmt.setBinaryStream(2, someInputStreamForTheData);
    // or: pstmt.setBytes(2, fileBytes);
    pstmt.executeUpdate();

顺便说一句,将 base64 编码图像保存在 blob 中(假设 BLOB SUB_TYPE BINARY,而不是 BLOB SUB_TYPE TEXT)对我来说没有多大意义,图像是二进制数据,而 blob 旨在保存二进制数据。使用 base64 会引入不必要的存储开销(每 3 个字节的数据增加 1 个字节)。

【讨论】:

是的,我尝试在我的 android 应用程序中实现这一点,但看起来“setBinartStream”尚未实现,因为 android 没有官方支持的版本并且驱动程序已经足够老了。但这不是这个问题的主题。 @ezh 你不应该直接从 Android 连接到 Firebird 数据库(或任何远程数据库),更明智的方法是用 Java 或其他语言构建一个 REST API 并让你的Android 应用程序与该 REST API 通信。 是的,我目前正在为此开发一个 API :)【参考方案2】:

不要将字符串文字插入 BLOB。使用参数化查询并通过它们将数据放入 BLOB。在这种情况下,它们至少可以保留 2 GB。

https://www.firebirdsql.org/file/documentation/drivers_documentation/java/3.0.0/docs/org/firebirdsql/jdbc/FBBlob.html

How to add blob image FIrebird in php?

pdo insert image into database directly - always inserting BLOB - 0B

【讨论】:

以上是关于Firebird 的 blob 大小是不是只有 32kb?的主要内容,如果未能解决你的问题,请参考以下文章

firebird 数据库恢复 firebird数据库修复 interbase数据库恢复 firebird blob错误恢复

如何测量 Firebird 2.1 数据库上 blob 占用的空间量?

Firebird 数据库 BLOB 类型有 20,000 字节,存储 blob 的 SQL Server 数据类型是啥?

如何在blob中写入txt文件

firebird 设置不区分大小写的排序规则

Firebird Case-Insensitive Searching 大小写不敏感查找