You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何访问PostgreSQL中使用LOB存储的表数据?

一、正确读取OID关联的大对象内容

你直接查pg_largeobject得到的是二进制分片的十六进制表示,要拿到可读内容得通过主表的OID关联读取:

  • 用lo_get函数(PostgreSQL 9.3+支持):假设你的业务主表叫your_table,执行以下SQL从主表取OID并读取对应大对象:
    SELECT lo_get(data::oid) FROM your_table;
    
    要是报“没有匹配给定名称和参数类型的函数”,说明你用的PostgreSQL版本低于9.3,换用lo_read方法,需要先打开对象:
    BEGIN;
    -- 先打开大对象,262144代表只读模式
    SELECT lo_open(data::oid, 262144) INTO :loid_handle FROM your_table LIMIT 1;
    -- 读取全部内容,第二个参数0是偏移量,第三个参数设足够大的数值覆盖内容长度
    SELECT lo_read(:loid_handle, 0, 10485760);
    -- 关闭对象
    SELECT lo_close(:loid_handle);
    COMMIT;
    
  • 也可以直接聚合pg_largeobject的分片数据转成字符串:
    SELECT convert_from(string_agg(data, ''), 'UTF8')
    FROM pg_largeobject
    WHERE loid = (SELECT data FROM your_table LIMIT 1) -- 替换成你主表的OID值
    ORDER BY pageno;
    

二、替代@Lob的方案:直接存储文本/JSON类型

如果不想用OID存大对象,直接存文本类型解决编码和异常问题:

1. 实体类配置

去掉@Lob注解,把字段设为String,指定列类型为TEXT(存任意长度文本)或JSONB(如果是JSON格式数据,支持JSON查询):

@Column(columnDefinition = "TEXT")
// 若为JSON数据,推荐用:
// @Column(columnDefinition = "JSONB")
private String data;

2. 解决编码异常

在application.properties里强制数据库连接用UTF-8:

spring.datasource.url=jdbc:postgresql://localhost:5432/your_db?useUnicode=true&characterEncoding=UTF-8
spring.datasource.hikari.connection-init-sql=SET NAMES 'UTF8'

同时检查数据库本身编码,执行SHOW server_encoding;,确保结果是UTF8,如果不是需要重建数据库或修改PostgreSQL配置文件(需重启服务)。

3. 解决插入异常

之前不用@Lob抛异常,大概率是用了varchar类型且内容长度超过驱动默认限制,换成TEXT类型就不存在长度限制问题,能直接存储大文本。

内容的提问来源于stack exchange,提问作者steven stonie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 07:52:50