create table RHP_EmployeElement (
amount double precision not null,
comment varchar(255),
loan blob,
element_codeId varchar(30),
empPrd_emp_code varchar(255),
empPrd_emp_folder_codeId numeric(18,0),
empPrd_prd_exe_exercice integer,
empPrd_prd_exe_fdr_codeId numeric(18,0),
empPrd_prd_period integer,
primary key (element_codeId,
empPrd_emp_code, empPrd_emp_folder_codeId, empPrd_prd_exe_exercice,
empPrd_prd_exe_folder_codeId, empPrd_prd_period)
)
Firebird 2.5.2(页面大小为 4096,UTF8 字符集)生成异常:
org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544351. unsuccessful metadata update key size exceeds implementation restriction for index "RDB$PRIMARY43"
我也遇到了关于列名称大小的相同限制异常(我认为是 31 个字符)
所有这些限制都是在专业 Hibernate 项目中使用 Firebird 的障碍,是否可以在没有所有这些限制的情况下为 Linux 和 Windows 重建 Firebird 项目?或者是否有其他方法来打破这些限制。
最佳答案
Indexes in Firebird 2.0以及更高的值受页面大小的限制:索引键不能超过页面大小的 1/4。对于页面大小 4096,这意味着索引键长度最大为 1024 字节,对于页面大小 16384,索引键长度为 4096 字节。
您的主键(及其支持索引)由以下列组成:
element_codeId VARCHAR(30)
= 30 字节(单字节字符集)或 120 (UTF8)empPrd_emp_code VARCHAR(255)
= 255 字节(单字节字符集)或 1020 (UTF8)empPrd_emp_folder_codeId NUMERIC(18,0)
= 8 字节empPrd_prd_exe_exercice INTEGER
= 4 字节empPrd_prd_exe_folder_codeId
未列出,假设为empPrd_prd_exe_fdr_codeId NUMERIC(18,0)
= 8 字节empPrd_prd_period INTEGER
= 4 字节
这导致总索引键为 309(单字节字符集)或 1164(+ 多列、排序规则等的一些额外字节开销)。对于字符集 UTF8
和页面大小 4096,这超出了页面大小规则的 1/4。解决方案是为数据库使用更大的页面大小,或者为 VARCHAR
列使用单字节字符集。
对于列名,Firebird 3.0 及更早版本中对象名的当前限制是 31 个字符(类似于 Oracle 的 30 个字节的限制)。 Firebird 4 已实现扩展此功能的功能请求 ( CORE-749 )。与具有此限制的其他数据库系统一样,您需要使用 @Column(name="theshortername"等提供显式列名称)
。其他对象也存在类似的选项。
关于sql - FBSQLException 键大小超出实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21577674/