周建儒
(四川信息職業(yè)技術(shù)學(xué)院信息工程系,廣元,628040)
圖片存儲有兩種方式:一種是將圖片單獨(dú)存放在固定文件夾里,數(shù)據(jù)庫表中對應(yīng)的字段僅保存該圖片的路徑和名字;這種方式實(shí)現(xiàn)簡單,數(shù)據(jù)表中無大數(shù)據(jù),訪問速度快,但是不安全,數(shù)據(jù)維護(hù)不方便。另一種是先對圖片進(jìn)行編碼,再將編碼后的數(shù)據(jù)寫到數(shù)據(jù)庫表中,需要時(shí)再從數(shù)據(jù)庫表中讀出,然后解碼生成圖片文件;這種方式比較安全,數(shù)據(jù)維護(hù)方便靈活。本文針對這兩種方式,用程序?qū)嵗M(jìn)行分析和比較。
MySQL是一個(gè)小型關(guān)系型數(shù)據(jù)庫管理系統(tǒng),體積小,速度快,開放源碼。Mysql支持存儲二進(jìn)制文件的BLOB字段類型;BLOB是個(gè)類型系列,包括:TinyBlob、Blob、MediumBlob、LongBlob,它們可容納的最大字節(jié)數(shù)分別是255B,65K,16M,4G。
預(yù)編譯語句PreparedStatement是java.sql的一個(gè)接口,也是Statement的子接口。通過Statement對象執(zhí)行SQL語句時(shí),需要將SQL語句發(fā)送給DBMS進(jìn)行編譯后再執(zhí)行。而預(yù)編譯語句是在創(chuàng)建PreparedStatement 對象時(shí)就指定了SQL語句,并發(fā)送給DBMS進(jìn)行編譯,當(dāng)該編譯語句被執(zhí)行時(shí),DBMS直接運(yùn)行編譯后的SQL語句,而不需要像其它SQL語句那樣先進(jìn)行編譯。
預(yù)編譯語句可以提高訪問數(shù)據(jù)庫的性能,數(shù)據(jù)庫在處理SQL語句時(shí)都有一個(gè)預(yù)編譯的過程,而預(yù)編譯對象就是把一些格式固定的SQL語句編譯后存放在數(shù)據(jù)庫緩沖池中。當(dāng)需要再次執(zhí)行相同的SQL語句時(shí)就不再進(jìn)行編譯了,直接由DBMS運(yùn)行SQL語句。所以當(dāng)需要多次執(zhí)行Statement對象的時(shí)候,使用PreparedStatement對象可以大大降低運(yùn)行時(shí)間,特別是大型數(shù)據(jù)庫,它可以有效地提高訪問數(shù)據(jù)庫的速度。
3.1.1 以二進(jìn)制格式將圖片寫入photo表中


3.1.2 從photo表中讀出圖片數(shù)據(jù),并生成圖片文件

Base64是一種基于64個(gè)可打印字符來表示二進(jìn)制數(shù)據(jù)的表示方法。Base64編碼的基本原理是:將字符串按每3個(gè)8位(3*8=24bit)字節(jié)分為一組,把每個(gè)字符的ASCII碼轉(zhuǎn)換成8位二進(jìn)制數(shù),就是一組24位的字節(jié),再把這24位分為4個(gè)6位(4*6=24bit)字節(jié),并在每個(gè)6位的高位添加兩個(gè)0,得到4個(gè)8位的字節(jié),然后將這4個(gè)8位的字節(jié)轉(zhuǎn)換成十進(jìn)制數(shù),然后對照Base64編碼表得到對應(yīng)的編碼字符。
3.2.1 先對圖片進(jìn)行Base64編碼,再將其寫入photo表中

3.2.2 從photo表中讀出圖片文件的base64編碼,解碼后重新生成圖片文件

用以上兩種方法在Mysql數(shù)據(jù)庫表中存儲同一個(gè)jpg格式的圖片,以二進(jìn)制數(shù)據(jù)格式存儲占用了2562個(gè)字節(jié),以Base64編碼格式存儲占用了3504個(gè)字節(jié)。可見,Base64編碼后的圖片數(shù)據(jù)增大,這是因?yàn)锽ase64編碼的數(shù)據(jù)冗余比較多,編碼后的數(shù)據(jù)長度是編碼前長度的三分之四倍。把圖片文件用base64編碼后再存入數(shù)據(jù)庫,會增大存儲空間,延長圖片訪問時(shí)間,減慢系統(tǒng)的響應(yīng)速度。Base64編碼可用于HTTP環(huán)境下傳遞較長的標(biāo)識信息。例如:在Hibernate中就把UUID編碼為一個(gè)字符串,用作HTTP表單和HTTPGETURL中的參數(shù)。
[1]Y.Daniel Liang,Java語言程序設(shè)計(jì)基礎(chǔ)篇[M].北京:機(jī)械工業(yè)出版社,2009.
[2]Paul DuBois,MySQL技術(shù)內(nèi)幕(第4版)[M].北京:人民郵電出版社,2011.
[3]尹繼平,Java范例大全[M].北京:機(jī)械工業(yè)出版社,2009.[4]劉書倫,Java程序設(shè)計(jì)[M].北京:國防科技大學(xué)出版社,2011.