如何通过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
相关产品推荐
相关产品推荐

