postgresql - 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 列?
解决方案
为了更新 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
推荐阅读
- azure - 检查 Azure 自动化运行手册 (PowerShell) 运行位置的方法是什么?
- css - 为焦点创建一个与浏览器无关的或 IE 备用内部按钮边框?(可访问性相关)
- apache-nifi - nifi putFile 进程未写入目录
- django - 没有调用 Django 上下文处理器
- java - 在 java web 项目中显示图像
- c# - .Net Core Web Api - 无法正确授权,得到 401
- swift - Xcode 给我写的所有东西都报错
- feathersjs - 处理现在存档的模块,即配置、快递、socketio、错误
- c# - 假设基本接口继承的泛型类型列表的Contra/Co Variance
- javascript - jQuery 搜索只搜索其所在的页面