注册
MySQL数据库字段BLOB类型迁移到达梦后转换为CLOB处理方法
专栏/写意人生/ 文章详情 /

MySQL数据库字段BLOB类型迁移到达梦后转换为CLOB处理方法

写意人生 2026/06/15 263 1 0
摘要 MySQL数据库字段BLOB类型迁移到达梦后转换为CLOB处理方法参考。

一、需求描述

在某业务系统数据迁移过程中,客户有个这样的需求:将MySQL数据库迁移到达梦数据库后,需要将部分表类型为BLOB的字段转换为CLOB类型。如下所示,将tb_sp_config表的img(mediumblob)转换为 img(clob)。
001.jpg

二、 数据处理方法

整个处理过程主要分为两步:第一步迁移数据,第二步对数据进行处理,其中第二步是最重要的。
(1)使用数据迁移工具DTS将MySQL库中的表和数据迁移到达梦数据库。
(2)在达梦数据库中,对tb_sp_config表的img(mediumblob)字段进行处理。
##tb_sp_config表增加一个临时的CLOB列
ALTER TABLE "BAM"."tb_sp_config" ADD COLUMN "img_clob" CLOB;
##将BLOB字段的数据转换后,更新到临时字段中。
UPDATE "BAM"."tb_sp_config" SET "img_clob" = BLOBTOCLOB(img);
##将原BLOB类型的字段img重命名为img_blob
ALTER TABLE "BAM"."tb_sp_config" RENAME COLUMN img TO img_blob;
##将新增加CLOB类型的字段img_clob重命名为img_clob
ALTER TABLE "BAM"."tb_sp_config" RENAME COLUMN img_clob TO img;
在将字段的BLOB值转换为CLOB值,涉及到调用系统包DBMS_LOB。DBMS_LOB包用于对大对象(BLOB、CLOB)进行多种操作。
使用包内的过程和函数之前,如果还未创建过系统包,请先调用系统过程创建系统包。
SP_CREATE_SYSTEM_PACKAGES (1,'DBMS_LOB');
将输入的BLOB类型数据转化为CLOB类型。
CREATE OR REPLACE FUNCTION BLOBTOCLOB (BLOB_IN IN BLOB)
RETURN CLOB
AS
V_CLOB CLOB;
V_VARCHAR VARCHAR2(32767);
V_START PLS_INTEGER := 1;
V_BUFFER PLS_INTEGER := 32767;
BEGIN
--创建一个临时的LOB对象,并存储在临时的表空间里。
DBMS_LOB.CREATETEMPORARY(V_CLOB,TRUE);
--返回LOB数据的字符长度。
FOR I IN 1 .. FLOOR(DBMS_LOB.GETLENGTH(BLOB_IN) / V_BUFFER)+ 1
LOOP
--获取指定偏移开始的指定长度的子串。
V_VARCHAR := UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(BLOB_IN, V_BUFFER, V_START));
--追加指定长度字符的数据到LOB对象的末尾。
DBMS_LOB.WRITEAPPEND(V_CLOB,LENGTH(V_VARCHAR), V_VARCHAR);
PRINT V_CLOB;
V_START := V_START + V_BUFFER;
END LOOP;
RETURN V_CLOB;
END BLOBTOCLOB;
/

调用函数,可以得到具体的转换值。:
SELECT BLOBTOCLOB('B4EFC3CECAFDBEDDBFE2D3D0CFDEB9ABCBBE');
特别说明:必须确保blob字段里存的确实是文本(如JSON、BASE64字符串、16进制等),而非视频、图片、PDF等二进制文件。如果存的是后者,改为CLOB必然乱码或者报错。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服