在PostgreSQL中无法将空值插入bytea字段

8

我无法在Postgres数据库中插入空值,数据类型为bytea(blob)。以下是我的Java代码片段:

ps.setNull(++index, java.sql.Types.BLOB);

bytea列是一个可空列。以下是表的描述。

testdb=# \d+ plan 
                           Table "public.plan"
   Column    | Type  | Modifiers | Storage  | Stats target | Description 

-------------+-------+-----------+----------+--------------+-------------

description | bytea |           | extended |              | 

Has OIDs: no

我遇到了以下异常: java.sql.BatchUpdateException: Batch entry 11 INSERT INTO public.plan(description) VALUES(NULL) was aborted. Call getNextException to see the cause.

你遇到了什么错误? - user330315
1
java.sql.BatchUpdateException: 批处理条目11 INSERT INTO public.plan(description) VALUES(NULL)已中止。调用getNextException以查看原因。 这是异常情况。 - Poulami
列“描述”是bytea类型,但表达式是oid类型。它是如何转换为oid的? - Poulami
尝试使用 setObject(++index, null)setNull(++index, Types.OTHER) - user330315
谢谢,使用setNull(++index, Types.OTHER)成功了。 :) - Poulami
2个回答

7
Postgres有两种不同的“BLOB”类型:bytea,这基本上是SQL标准定义的BLOB。还有“大对象”,它更或多或少地是指向二进制存储的“指针”(仍然存储在DB中)。
Postgres JDBC始终将“大对象”视为等效于BLOB(我从未理解过),因此ps.setNull(++index,java.sql.Types.BLOB);会使驱动程序认为您正在处理“大对象”(又名“oid”)列。
要克服这个问题,请使用:
ps.setNull(++index, Types.OTHER);

或者你可以使用以下方法:

ps.setObject(++index, null);

还有一个问题需要解决,这些解决方案有多可移植?为了后人:我已经在PostgreSQL 10.10、Oracle 12.1、MySQL 8.0.18和Derby 10.14上积极测试了ps.setObject(++index, null); - zb226

1

这对我也起作用:

ps.setNull(++index, Types.BINARY);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接