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的文檔說的非常詳細,按照零字節、單引號、斜線,以及字符的可打印性分別作了討論。原因是需要逃逸單引號和斜線字符,另外可打印字符可以不作轉換,直接出現。