全部產品
Search
文件中心

PolarDB:如何使用Blob對象

更新時間:Nov 14, 2024

本文介紹了如何使用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等編碼,都有一定的機率報語法錯誤。