首页 > 解决方案 > Postgres:更新 TEXT 列的值(CLOB)

问题描述

我有一个 TEXT 类型的列,它应该代表一个 CLOB 值,我正在尝试像这样更新它的值:

UPDATE my_table SET my_column = TEXT 'Text value';

通常这个列是由 Hibernate 读写的,我注意到用 Hibernate 写入的值存储为整数(可能是一些内部 Postgres 对 CLOB 数据的引用)。

但是当我尝试使用上述 SQL 更新列时,该值存储为字符串,当 Hibernate 尝试读取它时,我收到以下错误:Bad value for type long : ["Text value"]

我尝试了此答案中描述的所有选项,但结果始终相同。如何使用 SQL 插入/更新 TEXT 列?

标签: postgresqlhibernateclob

解决方案


为了更新 Hibernate 创建的 cblob,您应该使用函数来处理大对象:

可以在以下链接中找到该文档:

https://www.postgresql.org/docs/current/lo-interfaces.html
https://www.postgresql.org/docs/current/lo-funcs.html

例子:

查询:

select mytable.*,  convert_from(loread(lo_open(mycblobfield::int, x'40000'::int), x'40000'::int),  'UTF8') from mytable where mytable.id = 4;

obs:
x'40000'对应读模式(INV_WRITE)

更新:

select lowrite(lo_open(16425, x'60000'::int), convert_to('this an updated text','UTF8'));

Obs:
x'60000' = INV_WRITE + INV_READ 对应读写模式(INV_WRITE + IV_READ)。
数字 16425 是一个示例 loid(大对象 id),它已经存在于表的记录中。这是您可以在 Hinernate 创建的 blob 字段中看到的整数。

插入:

select lowrite(lo_open(lo_creat(-1), x'60000'::int), convert_to('this is a new text','UTF8'));

Obs:
lo_creat(-1) 生成一个新的大对象 a 返回它的 loid


推荐阅读