代码之家  ›  专栏  ›  技术社区  ›  dthrasher

Firebird中主键的最大大小是多少?

  •  5
  • dthrasher  · 技术社区  · 15 年前

    我需要在Firebird 2.1中将varchar(255)字段设置为数据库表的主键。

    我收到错误消息说字段太大。我使用的是utf8字符集,默认页面大小为4096。

    在火鸟身上可以这样做吗?我需要确保这个列是唯一的。

    3 回复  |  直到 13 年前
        1
  •  8
  •   EMBarbosa    13 年前

    如前所述,最大密钥大小是页面大小的1/4,但来自Firebird参考更新 (here) ,以字节为单位的最大可索引字符串长度比最大密钥长度小9。而utf8-in-firebird在内部存储为 4 Bytes/char .

    因此,在4096页大小的数据库中,utf8的最大长度是253个字符(4096/4-9=1024-9=1015,限制为253*4=1012)。因此,如果您想要一个更大的字符串,您需要一个更大的页面大小的数据库(即使您使用的是Firebird 2.5.x)。

        2
  •  1
  •   Douglas Tosi    15 年前

    根据 FirebirdFAQ Firebird 2.x中的最大密钥大小是页面大小的四分之一。如果页面大小为4096字节,则最大密钥大小为1024字节。
    utf8 varchars为每个字符保留一个完整的32位,尽管它可能占用更少的空间。因此,以utf8表示的varchar(255)是1020字节。我不知道它为什么会达到极限,但无论如何,我会增加页面大小或尝试varchar(254)。

        3
  •  0
  •   Community Jaime Torres    7 年前

    只需生成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 说。

    您可以在以下工具中很好地看到这一点 IBExpert full edition 或在 IBAnalist