背景:我正在使用jOOQ来访问Firebird数据库.Firebird 2.x的行大小限制为64KB.我以前从未达到过限制,但是这个特定的数据库使用UTF8,这意味着限制缩小到大约16K字符.
这就是我使用jOOQ的方式:
根据需要加载或创建POJO(生成).例如:
Book book = context.fetchOne("select * from book where book_id = ?", 1).into(Book.class);
Run Code Online (Sandbox Code Playgroud)根据需要使用book对象.
如果用户保存更改,则将其存储为记录.
BookRecord rec = context.newRecord(Tables.BOOK, book);
context.executeUpdate(rec);
Run Code Online (Sandbox Code Playgroud)第3步失败了,executeUpdate()因为某种程度上jOOQ正在将所有空VARCHAR字段转换为VARCHAR(4000).错误消息是
"SQL错误代码= -204.超出实现限制.块大小超出实现限制".
这是一个已知的Firebird限制,遗憾的是没有任何关于它的事情.
在表中我有大约8个空VARCHAR(512)字段,在UTF8中应该是大约8x4x512(或16KB),但是由于jOOQ将其解释为VARCHAR(4000),即8x4x4000(128KB),这显然超出了限制.
如果我将NULL或者空字段设置为某个随机字符串,那么jOOQ会将其转换为精确的字符串长度.("ABC"将被投射到varchar(3))
所以我的问题是:如果executeUpdate()没有jOOQ投射我的空字段,我如何开始工作VARCHAR(4000)?