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

如何通过Python实现Oracle数据库CLOB类型数据的写入与读取

问题根因
  • CLOB是Oracle的字符大对象类型,设计用来存储字符串数据,不支持直接存储原始字节流。你当前直接把字节类型数据写入CLOB字段,Oracle会自动将字节数据转译为十六进制字符串存储,这就是你查询时拿到十六进制结果的核心原因。
  • 额外注意:如果你提到的源数据确实是字节类型,那么代码里的data.encode()本身是错误的,Python3中字节类型没有encode方法,运行会直接报错,大概率是你对源数据类型的描述有误,实际源数据为字符串类型。即使源数据为字符串,直接将encode后的字节写入CLOB字段也会触发Oracle的自动十六进制转译。
解决方案

根据你的存储需求选择以下任意一种方案即可:

方案1:保留CLOB字段存储

CLOB仅支持存储字符串,写入时传入原始字符串而非字节即可:

# 如果源数据是字节类型,先解码为字符串,编码格式和源数据一致即可,通常为utf-8
data_param = data.decode("utf-8")
# 如果源数据本身是字符串类型,直接传data即可
# data_param = data
cursor.execute("""insert into test values (:data)""", data=data_param)

查询时直接获取的就是原始字符串,无需额外解码:

cursor.execute("select columns from test")
result = cursor.fetchall()
origin_str = result[1][0]
# 需要转回字节的话可自行encode
# origin_bytes = origin_str.encode("utf-8")

方案2:需要存储原始字节流

直接将表的对应字段类型从CLOB修改为BLOB(二进制大对象),BLOB是专门用来存储字节数据的类型:

# 源数据为字节类型直接传入即可,无需encode
cursor.execute("""insert into test values (:data)""", data=data)

查询时直接获取的就是原始字节数据:

cursor.execute("select columns from test")
result = cursor.fetchall()
origin_bytes = result[1][0]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:54:03