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