2009-12-23 13 views
5

Necesito establecer un campo Varchar (255) como la clave principal de una tabla de base de datos en Firebird 2.1.¿Cuál es el tamaño máximo de una clave principal en Firebird?

Aparece un mensaje de error que dice que el tamaño del campo es demasiado grande. Estoy usando UTF8 como mi conjunto de caracteres y el tamaño de página predeterminado de 4096.

¿Es posible hacer esto en Firebird? Necesito asegurarme de que esta columna sea única.

+0

cuando haces gstat: ¿cuál es la profundidad de tu índice en tu clave principal? –

+0

No estoy seguro de lo que quiere decir con "profundidad de índice". No he usado gstat antes. – dthrasher

+0

Tal vez [este hilo] (http://tech.groups.yahoo.com/group/firebird-support/message/98562) puede ayudarlo a comprender un poco del retorno de gstat. Debería leer los documentos de Ann Harrison en [sitio de IBPhoenix] (http://www.ibphoenix.com/resources/documents/design) para comprender cómo indexan los índices en Firebird (: – EMBarbosa

Respuesta

8

Como explicó el tamaño máximo clave es 1/4 del tamaño de la página, pero a partir de Firebird actualización de Referencia (here), la longitud máxima de la cadena indexable en bytes es 9 menos que la longitud máxima de la clave. Y UTF8 en Firebird se almacena internamente como 4 Bytes/char.

Por lo tanto, la longitud máxima para un UTF8 en una base de datos de 4096 páginas es de 253 caracteres (4096/4 -9 = 1024 -9 = 1015 que limita a 253 * 4 = 1012). Por lo tanto, si desea una cadena más grande, necesita una base de datos de mayor tamaño (incluso si está utilizando Firebird 2.5.x).

+0

Ah, eso lo explica. No pude entenderlo ¡Por qué me faltaban unos pocos bytes! – dthrasher

1

De acuerdo con FirebirdFAQ, el tamaño máximo de clave en Firebird 2.x es un cuarto del tamaño de página. Si el tamaño de su página es 4096 bytes, su tamaño máximo de clave es 1024 bytes.
Los varchars UTF8 reservan 32 bits completos por char aunque pueden usar menos espacio. Por lo tanto, varchar (255) en UTF8 es 1020 bytes. No sé por qué está llegando al límite, pero de todos modos aumentaría el tamaño de página o probaría varchar (254).

0

simplemente hacer gstat d: \ ruta \ database.fdb

obtendrá calle detrás como éste para su índice:

> 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 

si la profundidad es de más de 3: usted tendrá que aumentar la página tamaño. es lo mismo que Douglas Tosi decir.

Esto se puede ver muy bien en herramientas como IBExpert full edition o en IBAnalist

Cuestiones relacionadas