Firebird 计算行宽

Firebird 计算行宽,firebird,firebird2.5,Firebird,Firebird2.5,我在PHP中为Firebird(2.5.1)构建了一个类似phpmyadmin的小工具,但遇到了一些问题 有时我处理的是包含大量列的大型表,有些表接近64K行宽度限制。一旦我尝试执行ALTER TABLE查询以添加超过此限制的列,当我尝试提交查询时,PHP就会锁定,而不会返回响应或错误消息。为了避免这种情况,我希望在尝试添加新列之前计算表的当前总行宽 例如,我有一个包含638列的表(对此我无能为力),我尝试添加一个64字节的VARCHAR列(我知道字符可能占用多个字节,所以我使用字节来避免混淆)

我在PHP中为Firebird(2.5.1)构建了一个类似phpmyadmin的小工具,但遇到了一些问题

有时我处理的是包含大量列的大型表,有些表接近64K行宽度限制。一旦我尝试执行ALTER TABLE查询以添加超过此限制的列,当我尝试提交查询时,PHP就会锁定,而不会返回响应或错误消息。为了避免这种情况,我希望在尝试添加新列之前计算表的当前总行宽

例如,我有一个包含638列的表(对此我无能为力),我尝试添加一个64字节的VARCHAR列(我知道字符可能占用多个字节,所以我使用字节来避免混淆)。PHP冻结,FlameRobin在提交时告诉我:
65594字节的新记录太大了。然后我开始做一些计算

我使用以下查询根据Firebird中报告的大小计算行宽:

SELECT
    SUM(f.rdb$field_length)
FROM
    rdb$relation_fields rf
LEFT JOIN
    rdb$fields f ON rf.rdb$field_source=f.rdb$field_name
WHERE
    UPPER(rf.rdb$relation_name)='MY_TABLE';
这给了我总计64721个字节

这不可能是对的,因为这给了我815个字节的空闲空间,足以添加64个字节

然后我在某个地方读到VARCHAR字段为长度额外存储了2个字节。这是有道理的,所以我在计算中加入了这一点。我在这个表中有333个VARCHAR字段,所以我添加了666个字节,总共得到了65387个字节,还有149个字节可以使用

同样,这仍然足够存储64个字节(不,等等,现在是66个字节)


显然,Firebird将当前行宽度视为65528,我想知道这是如何确定的。是否还有其他字段的开销也很小?我想不出来,我希望有人能给出答案:)

请包括表的DDL和尝试添加的列。IIRC中,有一些内部代码会计入行的最大宽度,例如空值位集,它有638列,将占用80字节(可能更多)。但我不是100%确定。但说真的,638列对于任何健全的数据模型来说都太多了。这与问题本身无关,但为什么您仍然使用2.5.1而不是2.5.7?自从2.5.1.2.5.1有一个严重的索引错误以来,已经修复了几个安全错误,为了升级服务器,他必须备份和恢复所有的数据库-而FB2.5.x的实现细节在未来任何时候都可能更改。我认为服务器不报告错误就冻结是不可能的。查看firebird.log-可能导致服务器崩溃?请包括表的DDL和尝试添加的列。IIRC中,有一些内部代码会计入行的最大宽度,例如空值位集,它有638列,将占用80字节(可能更多)。但我不是100%确定。但说真的,638列对于任何健全的数据模型来说都太多了。这与问题本身无关,但为什么您仍然使用2.5.1而不是2.5.7?自从2.5.1.2.5.1有一个严重的索引错误以来,已经修复了几个安全错误,为了升级服务器,他必须备份和恢复所有的数据库-而FB2.5.x的实现细节在未来任何时候都可能更改。我认为服务器不报告错误就冻结是不可能的。查看firebird.log-可能导致服务器崩溃?