oracle的資料庫裡對於大字段儲存,通常有3種型別,一種就是所謂的blob型別,另一種就是clob型別,第三種是nclob型別,關於這三者者的使用範圍,應該說沒有嚴格意義上的要求,但大部分場景下我用經常使用blob儲存二進位制資料型別的東西,例如,單子流等,而使用clob來儲存大型文字資料,例如一篇文獻,或乙個xml等等,但是更好的情況下建議使用nclob來儲存雙位元組的文字資料,三者的儲存方式如下**所示
blob
byte
clob
char
nclob
double char
使用時候,需要注意,一般使用char型別,或者double char型別,不會出現亂碼情況,而使用byte型別儲存文字型別,非常容易出現亂碼,這一點,筆者深有體會,也許你存文字進blob欄位時你可能感覺沒問題,但是在取出來轉換時一些特殊符號,有時候就莫名其妙的亂碼了。所以對於文字型別,建議還是使用clob,或者nclob儲存,以避免一些亂碼問題.
另外需要注意的是:
如果你的單資料量只有幾千個字元,建議按照varchar/varchar2方式儲存,這樣提高訪問速度。但是對於幾萬或者更多的字元量,建議按照lob(clob/nclob)方式。
以下有幾點請注意:
(1)面對插入的情況,應該首先對插入的blob/clob所在字段,賦予乙個empty_blob()或empty_clob。再以更新方式,流形式插入
(2)所有的blob/clob物件(jdbc基本標準)沒有實現物件序列化,一般第三方(vender)類包可能會重新實現,比如weblogic的jdriver for oracle
(3)在從資料庫獲取clob/blob欄位的時候,不一定就以blob/clob物件位元組流獲取(有可能就是以其它位元組流方式獲取)
下面給出blob與clob欄位,在向資料庫插入,以及讀取時與字串互相轉換**
(1) 插入blob欄位型別
file file = new file("e:\\測試\\dog.jpg");int length = (int)file2.length();
inputstream f = new fileinputstream(file);
ps.setbinarystream(1, f, length);
(2) 資料庫插入clob欄位型別
file file = new file("e:\\測試資料\\文獻評估.txt");int length = (int)file.length();
inputstream f = new fileinputstream(file);
ps.setasciistream(1, f, length);
(3) blob欄位轉換成string字串
/*** blob欄位的通用轉換
* 注意可能出現亂碼
* @return 轉好的字串,
* **/
public string blobtostring(blob blob)
return str.tostring();
}catch (exception e) finallycatch(exception e)
} return null;
}
(4) clob欄位轉換成string字串
/*** clob欄位的通用轉換
* @return 轉好的字串,
* **/
public static string clobtostring(clob clob) throws sqlexception, ioexception
restring = sb.tostring(); //轉換成字串,進行返回
return restring;
}
(5) 將字串轉換成blob,或者clob欄位型別
/**注意筆者是 oracle11g* @param 需要轉換的引數
* 字串轉換成blob,clob,以及blob,clob轉換成字串
* @throws exception
* * */
public void covert(string str) throws exception catch (serialexception e) catch (sqlexception e)
}
至此,大字段的資料型別的轉換,插入,都可以實現了,另外需要注意的是,筆者的測試是在jdk7的版本和oracle 11g的資料庫下測試的,一些低的版本的jdk有些api可能不一樣
jdbc操作Blob和Clob欄位與字串的轉換
b size large oracle的資料庫裡對於大字段儲存,通常有3種型別,一種就是所謂的blob型別,另一種就是clob型別,第三種是nclob型別,關於這三者者的使用範圍,應該說沒有嚴格意義上的要求,但大部分場景下我用經常使用blob儲存二進位制資料型別的東西,例如,單子流等,而使用clob...
用JDBC操縱BLOB和CLOB資料
在訪問oracle 資料庫,對oracle 的blob 和clob 進行操作的時候,當通過oracle jdbc driver 來呼叫的時,如下所例 driver mydriver driver class.forname oracle.jdbc.driver.oracledriver newins...
JDBC 操作Blob資料
除了解決statement的拼串 sql問題之外,preparedstatement還有什麼好處?1 preparedstatement操作blob的資料,而statement做不到。2 preparedstatement可以實現更高效的批量操作。插入blob型別的資料必須使用preparedsta...