计算行宽

时间:2017-07-31 09:24:45

标签: firebird firebird2.5

我在PHP中为Firebird(2.5.1)构建了一个像phpmyadmin这样的小工具,我遇到了一些问题。

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

例如,我有一个包含638列的表(我无法做到这一点),我尝试添加64字节的VARCHAR列(我知道字符可以占用多个字节,所以我使用字节来避免混淆)。 PHP冻结,FlameRobin在提交时告诉我:new record size of 65594 bytes太大了。然后我开始做一些计算。

我使用以下查询根据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,我想知道这是如何确定的。还有其他领域的开销很小吗?我无法弄清楚,我希望那里有人有答案:)

0 个答案:

没有答案