本文介紹了如何使用Blob對象。
Java的MySQL各版本驅動(包括5.1.x和8.0.x),在實現PreparedStatement.setBlob方法時都有一些缺陷(無論串連的是mysql server還是PolarDB-X,都存在缺陷),對於一些用於儲存二進位格式(例如圖片、視頻等)的Blob對象,會有機率性的報出語法錯誤,本文列出一些需要注意的地方。
情境一:PolarDB-X版本<5.4.9
對於低版本的PolarDB-X,其自身不支援SQL中直接攜帶與串連串字元集不符的二進位資訊,需要在用戶端轉義成如下列所示的十六進位字串。
insert into t1 values (0xaabbccdd,x'aabbccdd');方法1:對於Java使用者,可以使用PreparedStatement.setBytes方法替換setBlob方法,MySQL驅動會將byte[]轉義成十六進位字串。
方法2:對於Java使用者,如果不方便使用方法1(例如使用Hibernate等架構,無法控制架構使用哪個set方法),請聯絡阿里雲支援人員,我們會提供一個定製的MySQL驅動包,該驅動包內會完成轉義。
方法3:對於其他語言使用者,請在應用程式中自行完成轉義。
情境二:5.4.9<=PolarDB-X版本<5.4.13
該版本的PolarDB-X,額外支援了_binary首碼。因此,除了情境一中的方法繼續適用之外,還有以下方法可以使用:
方法4:對於Java使用者,可以修改SQL語句,例如原語句:
insert into t1 values (?)修改為:
insert into t1 values (_binary?)方法5:對於Java使用者,可以使用8.0.26版本的MySQL驅動,該驅動在setBlob方法內會自動加上_binary首碼。
情境三:PolarDB-X版本>=5.4.13
該版本比較徹底的相容了MySQL對於二進位資訊的處理,上述情境一和情境二的方法繼續適用,還有以下方法可以使用:
方法6:使用utf8/utf8mb4串連資料庫,例如對於Java使用者,jdbcurl中加入參數:
useUnicode=true&characterEncoding=utf8對於其他語言使用者,可以在建完串連後,執行:
set names utf8mb4;實際上,MySQL驅動對於setBlob的實現是有問題的,即使是使用官方mysql server,也必須在串連使用utf8/utf8mb4編碼的情況下,才能很好的支援setBlob這種使用方法;對於gbk等編碼,都有一定的機率報語法錯誤。