周建儒
(四川信息職業(yè)技術(shù)學(xué)院信息工程系,廣元,628040)
圖片存儲有兩種方式:一種是將圖片單獨存放在固定文件夾里,數(shù)據(jù)庫表中對應(yīng)的字段僅保存該圖片的路徑和名字;這種方式實現(xiàn)簡單,數(shù)據(jù)表中無大數(shù)據(jù),訪問速度快,但是不安全,數(shù)據(jù)維護不方便。另一種是先對圖片進行編碼,再將編碼后的數(shù)據(jù)寫到數(shù)據(jù)庫表中,需要時再從數(shù)據(jù)庫表中讀出,然后解碼生成圖片文件;這種方式比較安全,數(shù)據(jù)維護方便靈活。本文針對這兩種方式,用程序?qū)嵗M行分析和比較。
MySQL是一個小型關(guān)系型數(shù)據(jù)庫管理系統(tǒng),體積小,速度快,開放源碼。Mysql支持存儲二進制文件的BLOB字段類型;BLOB是個類型系列,包括:TinyBlob、Blob、MediumBlob、LongBlob,它們可容納的最大字節(jié)數(shù)分別是255B,65K,16M,4G。
預(yù)編譯語句PreparedStatement是java.sql的一個接口,也是Statement的子接口。通過Statement對象執(zhí)行SQL語句時,需要將SQL語句發(fā)送給DBMS進行編譯后再執(zhí)行。而預(yù)編譯語句是在創(chuàng)建PreparedStatement 對象時就指定了SQL語句,并發(fā)送給DBMS進行編譯,當(dāng)該編譯語句被執(zhí)行時,DBMS直接運行編譯后的SQL語句,而不需要像其它SQL語句那樣先進行編譯。
預(yù)編譯語句可以提高訪問數(shù)據(jù)庫的性能,數(shù)據(jù)庫在處理SQL語句時都有一個預(yù)編譯的過程,而預(yù)編譯對象就是把一些格式固定的SQL語句編譯后存放在數(shù)據(jù)庫緩沖池中。當(dāng)需要再次執(zhí)行相同的SQL語句時就不再進行編譯了,直接由DBMS運行SQL語句。所以當(dāng)需要多次執(zhí)行Statement對象的時候,使用PreparedStatement對象可以大大降低運行時間,特別是大型數(shù)據(jù)庫,它可以有效地提高訪問數(shù)據(jù)庫的速度。
3.1.1 以二進制格式將圖片寫入photo表中
3.1.2 從photo表中讀出圖片數(shù)據(jù),并生成圖片文件
Base64是一種基于64個可打印字符來表示二進制數(shù)據(jù)的表示方法。Base64編碼的基本原理是:將字符串按每3個8位(3*8=24bit)字節(jié)分為一組,把每個字符的ASCII碼轉(zhuǎn)換成8位二進制數(shù),就是一組24位的字節(jié),再把這24位分為4個6位(4*6=24bit)字節(jié),并在每個6位的高位添加兩個0,得到4個8位的字節(jié),然后將這4個8位的字節(jié)轉(zhuǎn)換成十進制數(shù),然后對照Base64編碼表得到對應(yīng)的編碼字符。
3.2.1 先對圖片進行Base64編碼,再將其寫入photo表中
3.2.2 從photo表中讀出圖片文件的base64編碼,解碼后重新生成圖片文件
用以上兩種方法在Mysql數(shù)據(jù)庫表中存儲同一個jpg格式的圖片,以二進制數(shù)據(jù)格式存儲占用了2562個字節(jié),以Base64編碼格式存儲占用了3504個字節(jié)。可見,Base64編碼后的圖片數(shù)據(jù)增大,這是因為Base64編碼的數(shù)據(jù)冗余比較多,編碼后的數(shù)據(jù)長度是編碼前長度的三分之四倍。把圖片文件用base64編碼后再存入數(shù)據(jù)庫,會增大存儲空間,延長圖片訪問時間,減慢系統(tǒng)的響應(yīng)速度。Base64編碼可用于HTTP環(huán)境下傳遞較長的標(biāo)識信息。例如:在Hibernate中就把UUID編碼為一個字符串,用作HTTP表單和HTTPGETURL中的參數(shù)。
[1]Y.Daniel Liang,Java語言程序設(shè)計基礎(chǔ)篇[M].北京:機械工業(yè)出版社,2009.
[2]Paul DuBois,MySQL技術(shù)內(nèi)幕(第4版)[M].北京:人民郵電出版社,2011.
[3]尹繼平,Java范例大全[M].北京:機械工業(yè)出版社,2009.[4]劉書倫,Java程序設(shè)計[M].北京:國防科技大學(xué)出版社,2011.