目录
1、问题描述:
项目在RDBMS(关系型数据库)的mysql中使用BLOB类型字段存储了图片,由于需求问题,需要迁移图片到另外的一个RDBMS(关系型数据库)中去,思路是借助ETL工具kettle迁移数据,由于图片存储较大,kettle会比较耗费内存,设备内存不是特别的大,所以设置内存中一次存储的记录数为500(数据量少点就行),可以实现数据迁移。但是数据迁移后发现一个问题:
迁移后的BLOB类型字段存储的图片不能看了,通过navicate将该字段显示为图片时,无法查看该图片,并且该字段的存储也变成了原来存储的1.6-2倍。
2、问题查找:
RDBMS(关系型数据库)迁移BLOB类型字段存储的图片,产生迁移后图片不能查看,并且存储变成原来的1.8-2倍。本人思考可能是由于图片在RDBMS(关系型数据库)中存储的是二进制,在通过ETL工具kettle迁移过程中可能由于编码问题,让图片的二进制进行了编码,最终导致迁移后图片不能查看了。
3、解决方法:
通过ETL工具kettle迁移RDBMS(关系型数据库)中BLOB类型字段存储的图片数据时,在表输入的时候不要直接读取BLOB类型的二进制图片信息,要通过HEX(pic_column)函数将二进制转换为十六进制,然后将十六进制的信息存储到目标数据库中,等数据都迁移完毕后,再将十六进制的信息通过UNHEX(pic_column)函数将十六进制转换为二进制的信息,通过执行SQL的update语句,将十六进制信息修改为二进制信息,这样图片就可以正常显示了。此方式可以完美解决BLOB类型图片迁移问题。具体步骤如下:
(1)表输入:
SELECT id,HEX(pic_image) FROM tm_pic_original
(2)执行SQL语句修改:
UPDATE picture_info SET pic_image = UNHEX(pic_image)