字符索引
在Firebird2.0以前的版中,一个问题会发生在建立一个字符列的索引使用非标准排序规则时:
没有进行排序规则指定索引字段的长度被限制为252个字节或如果被指定时限制为84字节,多字节字符集和复合索引的大小限制更进一步。
从Firebird2.0版开始,索引的最大长度等于页面大小的一个四分之一,即从1024到4096字节。索引字符串的最大长度为9字节,小于该四分之一页的限制.
计算索引字符串字段的最大长度:下面的公式计算一个被索引的字符串(字符)最大长度:
max_char_length = FLOOR((page_size / 4 - 9) / N)
N为每个字符在字集中的长度
下面的表格显示了一个索引字符串的最大长度(在字符中),它是用这个公式根据页面大小和字符集计算的。
表 3.5.页面大小和字符大小的最大索引长度
页面大小 | 每个字符占用的字节数 | ||||
1 | 2 | 3 | 4 | 5 | |
4,096 | 1,015 | 507 | 338 | 253 | 169 |
8,192 | 2,039 | 1,019 | 679 | 509 | 339 |
16,384 | 4,087 | 2,043 | 1,362 | 1,021 | 682 |
备注
使用不区分大小写的排序规则 ("_CI"),在索引中的一个字符将占用不是4,而是6(六)字节,所以最大键长度为一页,例如,4096 字节,最大字符数将 169 个字符。
参阅:创建数据库(CREATE DATABASE),排序规则序列(Collation sequence), SELECT语句, WHERE子句, GROUP BY子句, ORDER BY子句
字符类详细
CHAR
CHAR为固定长度数据类型,如果输入的字符数小于声明的长度,字段尾部将添加空格字符。一般来说,填充字符并不一定为空格字符:这取决于字符集,例如,OCTETS字符集填充为字符为零。
此数据类型的完整名称是CHARACTER,这里并没有要使用完整名称且人们很少这样用.
固定长度的字符数据可用于存储长度为标准的编码,有一个明确的“宽度”目录。这类编码的一个例子是一个EAN13 条码-13字符,都被填满。
声明语法:
CHAR [(length)] [CHARACTER SET <set>] [COLLATE <name>]
备注
如果没有指定长度,它采取的是1。
一个有效的长度是从 1 到 32,767 内可以容纳的字符的最大数目字节数。
VARCHAR
VARCHAR 是基本的字符串类型用于存储可变长度,最大为 32,765 字节的文本。存储的结构是等于实际大小的数据再加上2个用于记录的数据的长度字节。
从客户端应用程序向数据库发送的所有字符被都视为有意义,包括前置和尾部空格。但是,尾随空格不存储:他们将恢复后检索达到记录的字符串的长度。
此数据类型的完整名称是CHARACTER VARYING,另一个变体的名字写作CHAR VARYING
声明语法:
VARCHAR (length) [CHARACTER SET <set>] [COLLATE <name>]
NCHAR
NCHAR带ISO8859_1字符集预定义是一个定长字符数据类型。在所有其他方面它与CHAR的相同。
语法:
NCHAR (length)
同义词的名称是NATIONAL CHAR。一个类似的数据类型可用于可变长度的字符串类型:NATIONAL CHARACTER VARYING.