和MysqL的一样不,需要bind吗,那对应MysqL_stmt_init和MysqL_stmt_prepare、MysqL_stmt_bind_param、MysqL_stmt_execute对API是哪些 楼主 – guojinshihuaidan:
1个回复
如果想要在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 INTOtable1 (fileid,filename,content)VALUES(1,'filename.doc',E'\\000\\001\\002');
INSERT INTOtable1 (fileid,content)VALUES(2,'anotherfile.jpg',E'\\000\\377');
UPDATEtable1SETcontent = E'\\000\\000\\000'WHEREfileid = 1;
UPDATEtable1SETcontent = content || E'\\377\\377\\377'WHEREfileid = 2;
可以在INSERT INTO中包含整个文件的bytea类型字符串,也可以像上面第四行那样,分块追加。对于短小的二进制数据,在命令控制台中编辑sql命令也未尝不可。但是如果要存储一个图片文件或者Word文档之类的大型二进制数据的时候,就需要借助数据访问借口,或者自己写一个字节转换程序,直接操作sql语句。
插入bytea数据后可以使用SELECT语句获取它。如下所示:
SELECTcontentFROMtable1;
在命令控制台中,我们会看到以输入时的字符串格式输出二进制数据,这是Postgresql做的转换。在Python中使用psycopg2模块,执行上述SELECT语句后能够获得原始的二进制字节字符串,可以直接写入二进制文件。
顺便说明一下。对于字节的转换,Postgresql的文档说的非常详细,按照零字节、单引号、斜线,以及字符的可打印性分别作了讨论。原因是需要逃逸单引号和斜线字符,另外可打印字符可以不作转换,直接出现。
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前輩指點才過關的。
真是眾裏尋它千百度,衣帶漸寬終不悔,再回頭已百年身。烏乎哀哉
1. 比如有一个实体定义例如:
/**
*@generated
*@display数据
*/
@Column(name = "f_data")
private byte[] data;
/**
*@display数据
*/
@Column(name = "f_data2")
private Integer[] data2;
要保存到postgres过程中会出现data读取数据混乱,不是原来的数据,data2会出现无法反序列化问题
解决办法:修改postgres的postgresql.conf配置文件
bytea_output = 'escape'# hex,escape
意思是设置bytea_output的输出类型设置为转义类型输出,而postgres默认是hex类型输出,所以导致转换数据混乱问题
参考文档:
8.4. Binary Data Types
The bytea data type allows storage of binary strings; see Table 8-6.
...
18.10. Client Connection Defaults
18.10.1. Statement Behavior
bytea_output (enum)
Sets the output format for values of type bytea. Valid values are hex (the default) and escape (the Traditional Postgresql format). See Section 8.4 for more @R_698_4045@ion. The bytea type always accepts both formats on input,regardless of this setting.
以上配置需要重启postgres服务才生效!!!
参考资料
Postgresql Document:
http://www.postgresql.org/docs/9.2/static/datatype-binary.html
Postgresql public API(LargeObject):http://jdbc.postgresql.org/documentation/publicapi/index.html
Postgresql JDBC Interface:
http://jdbc.postgresql.org/documentation/head/binary-data.html
二进制类型bytea的操作(在最大值内,有内存限制)
1 |
Create table byteatable(id int ,obj bytea); |
①直接插入逃逸序列
bytea 文本逃逸八进制
http://www.postgresql.org/docs/9.2/interactive/datatype-binary.html#DATATYPE-BINARY-TABLE
十进制数值 |
描述 |
输入逃逸形式 |
例子 |
输出形式 |
0 |
八进制的零 |
E'\\000' |
SELECT E'\\000'::bytea; |
\000 |
39 |
单引号 |
''''或E'\\047' |
SELECT E'\''::bytea; |
' |
92 |
反斜杠 |
E'\\\\'或E'\\134' |
SELECT E'\\\\'::bytea; |
\\ |
0到31以及127到255 |
"不可打印"字节 |
E'\\xxx'(八进制值) |
SELECT E'\\001'::bytea; |
\001 |