【问题标题】:Unable to insert null in bytea field in postgres无法在 postgres 的 bytea 字段中插入 null
【发布时间】:2016-03-11 17:39:02
【问题描述】:

我无法在数据类型为 bytea(blob) 的 postgres 数据库中插入空值。这是我的 java 代码 sn-p:

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:批处理条目 11 INSERT INTO public.plan(description) VALUES(NULL) 被中止。调用 getNextException 查看原因。

【问题讨论】:

  • 你得到的错误是什么?
  • java.sql.BatchUpdateException:批处理条目 11 INSERT INTO public.plan(description) VALUES(NULL) 被中止。调用 getNextException 查看原因。这是个例外。
  • 列“描述”的类型是 bytea,但表达式的类型是 oid。它是如何转换为oid的。
  • 试试setObject(++index, null)setNull(++index, Types.OTHER)
  • 谢谢,它与 setNull(++index, Types.OTHER) 一起工作。 :)

标签: postgresql jdbc blob


【解决方案1】:

Postgres 有两种不同的“BLOB”类型:bytea,本质上是 SQL 标准定义为 BLOB 的内容。还有“大对象”,它或多或少是指向二进制存储的“指针”(它仍然存储在数据库中)。

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);
【解决方案2】:

这也对我有用:

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

【讨论】:

    猜你喜欢
    • 2015-08-15
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 2016-06-23
    相关资源
    最近更新 更多