开发者社区> xaubllxwtvaqiu> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

最佳实践—如何使用Blob对象

简介: 本文介绍了如何使用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等编码,都有一定的概率报语法错误。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
最佳实践—如何使用Blob对象
本文介绍了如何使用Blob对象。
25 0
最佳实践—如何使用Blob对象
本文介绍了如何使用Blob对象。
18 0
最佳实践—如何使用Blob对象
本文介绍了如何使用Blob对象。
28 0
最佳实践—如何使用Blob对象
本文介绍了如何使用Blob对象。
13 0
最佳实践—如何使用Blob对象
本文介绍了如何使用Blob对象。
14 0
最佳实践—如何使用Blob对象
本文介绍了如何使用Blob对象。
25 0
最佳实践—如何使用Blob对象
本文介绍了如何使用Blob对象。
23 0
最佳实践—如何使用Blob对象
本文介绍了如何使用Blob对象。
21 0
最佳实践—如何使用Blob对象
本文介绍了如何使用Blob对象。
28 0
最佳实践—如何使用Blob对象
本文介绍了如何使用Blob对象。
84 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
实战-如何基于HBase构建图片视频数据的统一存储检索方案
立即下载
如何使用Tair增强数据结构构建丰富在线实时场景
立即下载
低代码开发师(初级)实战教程
立即下载