❶ postgresql插入bytea類型數據,sql語句
PostgreSQL的二進制數據類型為bytea,可最多保存2G的數據。在ADO、ODBC等介面,可通過帶參數化的插入SQL語句上傳二進制。
然而在某些介面、SQL語句無法進行參數綁定,或者某些語言沒有二進制的類型,或者介面的不兼容等原因,常無法上傳二進制數據。
碰到這種情況下,必須在客戶端將二進制轉化為一定規則的字元序列,然後插入語句時,來個顯示轉換cast('字元序列' as bytea).
二進制轉化為字元序列的規則:
分析每個位元組,當其ASCII值在0到31,127到255,或為39、92,請將這位元組轉化為3位的八進制字元串,前面加上2個反斜杠,如chr(39)表示為//047. 其他ascii值為可顯示字元,不變,當然你也可全部轉化為八進制,但這樣整個字元串太長,浪費空間。
如二進制序列 chr(0)+'a'+'b'+chr(233)+chr(25)+'c'轉化為字元序列為:
//000ab//351//031c
上傳的時候再來個顯示轉換,如 insert into table1 (aa) values (cast('//000ab//351//031c' as bytea))
如果二進制數據太大,可分次上傳,用||連接符連接起來,如:
insert into table1 (id,aa) values (1,cast('序列1' as bytea))
update table1 set aa=aa||cast('序列2' as bytea) where id=1
❷ PostgreSQL 動態SQL語句怎麼寫
PostgreSQL的PL/pgSQL語言是支持動態SQL語句的(說execute immediate的是ECPG所支持的)。但是,要記得重要的一點: 是在PL/pgSQL語言中支持。而PL/pgSQL語言一個塊結構的語言,它以begin ... end為塊的開始與結束標識。這也就是說,要執行動態SQL語句,就必須放到begin ... end塊中,而不要想實現一個單獨的動態SQL語句。在SQL Server中,倒是可以輕松的實現,我們可以直接執行一個這樣的動態SQL:
executesp_executesqlN'select1asval'
而在PostgreSQL中,就不要有此想法了。當然,SQL Server的這種動態SQL語句的執行方法也有其局限與不便的地方。
在PL/pgSQL中,執行動態SQL的格式如下(摘錄自說明文檔):
EXECUTEcommand-string[INTO[STRICT]target][USINGexpression[,...]];
其中,
command-string就是要執行的動態SQL語句(一定要記住:這里是SQL語句,不是PL/pgSQL語句,像raise notice就不能使用);
INTO子句是把SQL查詢到的值賦給INTO指定的變數;
USING子句是前面的command-string中替代變數($1, $2, ...)的賦值;
示例:
do$$
declare
v_c1integer;
v_c2integer;
begin
execute'selectcount(*)asc1,count(*)asc2from()swhereidx>$1'
intov_c1,v_c2
using10;
raisenotice'%,%',v_c1,v_c2;
❸ 怎麼把sql文件導入postgresql資料庫
1、打開PgAdminIII ,連接伺服器。選擇要執行該文件的資料庫。
2、看到上面欄目有sql字樣的圖標,點擊。
3、打開後,點擊導入文件。執行即可。
❹ 如何向postgreSQL中添加bytea類型的大對象數據
如果想要在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的文檔說的非常詳細,按照零位元組、單引號、斜線,以及字元的可列印性分別作了討論。原因是需要逃逸單引號和斜線字元,另外可列印字元可以不作轉換,直接出現。