我需要将一个Varchar(255)字段设置为Firebird 2.1中数据库表的主键。
我收到错误消息,指出字段大小太大。我使用UTF8作为我的字符集,默认页面大小为4096.
可以在Firebird中执行此操作吗?我需要确保此列是唯一的。
答案 0 :(得分:8)
如上所述,最大密钥大小是页面大小的1/4,但是从Firebird参考更新(here)开始,最大可索引字符串长度(以字节为单位)比最大密钥长度小9。 Firebird中的UTF8内部存储为4 Bytes/char。
因此,4096页大小的数据库中UTF8的最大长度为253个字符(4096/4 -9 = 1024 -9 = 1015,限制为253 * 4 = 1012)。因此,如果你想要一个更大的字符串,你需要一个更大的页面大小的数据库(即使你使用的是Firebird 2.5.x)。
答案 1 :(得分:1)
根据FirebirdFAQ,Firebird 2.x中的最大密钥大小是页面大小的四分之一。如果页面大小为4096字节,则最大密钥大小为1024字节 UTF8 varchars为每个字符保留一个完整的32位,即使它可能占用更少的空间。因此,UTF8中的varchar(255)是1020个字节。我不知道为什么它会达到极限,但无论如何我会增加页面大小或尝试varchar(254)。
答案 2 :(得分:0)
只需创建gstat d:\ path \ database.fdb
你的索引会得到这样的东西:
> Index CLIENT_IDX (2)
> Depth: 3, leaf buckets: 545, nodes: 138523
> Average data length: 10.12, total dup: 13873, max dup: 645
> Fill distribution:
> 0 - 19% = 0
> 20 - 39% = 0
> 40 - 59% = 0
> 60 - 79% = 0
> 80 - 99% = 545
如果深度超过3:您将不得不增加页面大小。 它与Douglas Tosi说的相同。
等工具中看到这一点