如何向postgreSQL中添加bytea类型的大对象数据

本文介绍了如何在PostgreSQL中使用bytea类型存储二进制数据,如Word、Excel文档和图片。通过将二进制数据转换为八进制字符串并在SQL语句中插入,同时提供了插入、更新和查询bytea数据的方法。还讨论了存储大型二进制数据时的注意事项,以及如何处理数据混乱和反序列化问题。并提到了配置参数bytea_output以解决数据转换问题。
摘要由CSDN通过智能技术生成
               
1)请教大家,如何向postgreSQL中添加bytea类型的大对象数据?
和mysql的一样不,需要bind吗,那对应mysql_stmt_init和mysql_stmt_prepare、mysql_stmt_bind_param、mysql_stmt_execute对API是哪些 楼主 – guojinshihuaidan:

1个回复
回复 1楼 – guojinshihuaidan:添加成功了,用PQprepare和PQexecPrepared

2)

如果想要在PostgreSQL中存储二进制数据,例如存储Word、Excel文档,图片文件等,可以使用bytea类型的列。bytea类型是PostgreSQL特有的存储二进制数据的字段类型,与SQL标准中的BLOB和BINARY LARGE OBJECT类型异曲同工。这在PostgreSQL文档的bytea类型介绍中有所说明。

接下来先说说如何向表中插入、更新bytea数据。

PostgreSQL允许在SQL命令中包含bytea类型的数据,以便能够使用INSERT向表中插入含有二进制数据的记录,使用UPDATE和调用与bytea类型相关的函数更新和操作bytea类型数据。二进制数据是一个字节序列,然而SQL命令是文本字符串,怎样在SQL中写入二进制数据呢?答案很简单,把每一个字节转换成对应的三位十进制数字的八进制数字符串表示,以双斜线做为前缀,即0x00表示为\\000、0x2C表示为\\02C、0xFF表示为\\377,并按照bytea类型的要求在字符串前端的单引号外注明E。举例如下:

INSERT INTO table1 (fileid, filename, content) VALUES (1, 'filename.doc', E'\\000\\001\\002');
INSERT INTO table1 (fileid, filename, content) VALUES (2, 'anotherfile.jpg', E'\\000\\377');
UPDATE table1 SET content = E'\\000\\000\\000' WHERE fileid = 1;
UPDATE table1 SET content = content || E'\\377\\377\\377' WHERE fileid = 2;

可以在INSERT INTO中包含整个文件的bytea类型字符串,也可以像上面第四行那样,分块追加。对于短小的二进制数据,在命令控制台中编辑SQL命令也未尝不可。但是如果要存储一个图片文件或者Word文档之类的大型二进制数据的时候,就需要借助数据访问借口,或者自己写一个字节转换程序,直接操作SQL语句。

插入bytea数据后可以使用SELECT语句获取它。如下所示:

SELECT content FROM table1;

在命令控制台中,我们会看到以输入时的字符串格式输出二进制数据,这是PostgreSQL做的转换。在Python中使用psycopg2模块,执行上述SELECT语句后能够获得原始的二进制字节字符串,可以直接写入二进制文件。

顺便说明一下。对于字节的转换,PostgreSQL的文档说的非常详细,按照零字节、单引号、斜线,以及字符的可打印性分别作了讨论。原因是需要逃逸单引号和斜线字符,另外可打印字符可以不作转换,直接出现。


3)

PostgreSQL-Bytea存BlobDAta出错

用PostgreSQL-Bytea存BlobDAta,如mdb/mp3/jpg/doc等檔案,試了好幾天,是可以存進去,可是轉出來時老是無法使用,經研究發現它的體積會自動長大,且會以3.31的比率增加。這轉出來檔當然是不能用了。而且我用BlobField.BolbSize去看資料庫中的存檔大小就是這個轉出的Size,這表示是在存入時出了問題。這要如何處理?

設定可以處理Bytea-Blob存取BinaryData的功能
1.編修postgresql.conf:程式集->PostgreSQL8.2->編修控制檔->edit postgresql.conf。
2.改Connections and Authentication-section,加 listen_addresses = '*'
3.改Version/platform Compatibility加兩行
escape_string_warning = off
standard_conforming_strings = off

別小看這三行,小弟這三行可是花了三四個星期,把手冊全印出來裝釘研讀多次,還去PG姥姥家及Google翻江倒海了好久,最後還是靠Multics前輩指點才過關的。
真是眾裏尋它千百度,衣帶漸寬終不悔&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值