小编Sug*_*Lim的帖子

JOOQ和Firebird - 超出实施限制

背景:我正在使用jOOQ来访问Firebird数据库.Firebird 2.x的行大小限制为64KB.我以前从未达到过限制,但是这个特定的数据库使用UTF8,这意味着限制缩小到大约16K字符.

这就是我使用jOOQ的方式:

  1. 根据需要加载或创建POJO(生成).例如:

    Book book = context.fetchOne("select * from book where book_id = ?",  1).into(Book.class);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 根据需要使用book对象.

  3. 如果用户保存更改,则将其存储为记录.

    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)

java sql firebird jooq

6
推荐指数
1
解决办法
376
查看次数

标签 统计

firebird ×1

java ×1

jooq ×1

sql ×1