参考资料
PostgreSQL Doc: 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的操作(在最大值内,有内存限制)
Create table byteatable(id int,obj bytea);
①直接强制类型输入:
Insert into byteatable values(1, '123'::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 |
Insert into byteatable values(1, ''''); //插入一个单引号-‘
③ 通过base64的encode编码字符串
encode在线编码器 http://www.opinionatedgeek.com/dotnet/tools/base64encode/
你好 编码为 5L2g5aW9
select encode('你好', 'base64');
-------------------------------
5L2g5aW9
Insert into byteatable values(1,decode(‘5L2g5aW9’,’base64’));//5L2g5aW9是【你好】编码后的代码
④通过pg_read_binary_file()函数
Insert into byteatable values(256,pg_read_binary_file('lob/imagejpg')); //插入一张图片- ../data/lob/image.jpg
注意:函数pg_read_binary_file()中的路径必须是相对路径,默认路径是data目录下,并且必须在data目录下或者data目录的子目录下。
Name |
Return Type |
Description |
pg_read_file(filename text [, offset bigint, length bigint]) |
text |
Return the contents of a text file |
pg_read_binary_file(filename text [, offset bigint, length bigint]) |
bytea |
Return the contents of a file |
⑤通过copy to可以导出bytea的文本形式编码 , 通过copy from可以通过文本形式的编码想bytea导入二进制对象。
大对象类型oid的操作(在最大值内,没有内存限制)
Create table oidtable(id int, obj oid);
Insert into oidtable(id,obj) values(1,lo_import(‘d:/1.jpg’));
select lo_export(obj, ‘e:/11.jpg’) from oidtable where id=1; //将以上插入的1.jp从表中取出来存成e盘的11.jpg。
大对象数据在pg_largeobject表中是以其创建时的OID标识的。每个大对象都分解成足够小的小段或者"页面"以便以行的形式存储在pg_largeobject 里。每页的数据定义为LOBLKSIZE(目前是BLCKSZ/4 或者通常是 2K 字)。
Bytea与oid的比较
资料:http://www.microolap.com/products/connectivity/postgresdac/help/TipsAndTricks/ByteaVsOid.htm
BYTEA vs OID (Large Objects)
Comparative table
Characteristic |
BYTEA |
OID |
Max. allowed space |
1 GB |
2 GB |
Data access |
As a whole |
Stream-style |
Storage |
In defined table |
In pg_largeobject system table |
Data manipulation |
Using SQL and escaping sequnces |
Only within transaction block by special functions |
Loading |
Preload |
On demand |
将二进制类型导出到文件
highgo=# SELECT lo_export(txt, E'C:\\HighGo\\Database\\1.3.1\\aa.txt') FROM lyy.
clob1;
lo_export
-----------
1
(1 行记录)
来源:oschina
链接:https://my.oschina.net/u/1158288/blog/151231