源库和目标库的字符集对大小写敏感度不一致时,通过DTS进行迁移或同步的过程中,可能会出现目标库缺少数据的情况。本文介绍如何避免这种情况的发生。

问题描述

不同的数据库对大小写敏感度的要求会存在差异。当目标库和源库数据库大小写敏感度不一致时,可能会在迁移或同步结束后,发现目标库缺少数据。

问题示例

以Oracle和MySQL为例,说明数据库对大小写敏感度要求不一致导致目标库数据缺失的情况。

Oracle数据库和MySQL数据库对大小写敏感度的要求不一致。

  • Oracle:区分大小写,对主键或唯一键字段可以插入仅大小写不同的值,如'a'和’A'。
  • MySQL:是否区分大小写由字符序(COLLATE)决定。一般"_ci"表示大小写不敏感;"_cs"表示大小写敏感。当字符序后缀为"_ci"时不区分大小写,主键或唯一键字段不能插入仅大小写不同的值,如'a'和’A'。

迁移场景:从源库Oracle向目标库MySQL迁移数据。配置DTS迁移任务后,不勾选结构迁移,迁移完成后,查看目标库数据。

源库和目标库类型 字符集 迁移动作说明 源库和目标库数据
源库:Oracle AL32UTF 迁移对象:gb.test
create table gb.test
(id int primary key, name varchar2(10))
查看源库数据如下:源库数据
插入数据:

insert into test values (1,'a');

insert into test values (2,'A');

insert into test values (3,'abc');

insert into test values (4,'Abc');

insert into test values (4,'aBc');

insert into test values (5,'aBc');

insert into test values (6,'abC');

commit;
目标库:MySQL utf8
说明 默认大小写不敏感。
自建以下表结构:
create table
test.test (auto_id int primary key auto_increment, name varchar(10), unique
key(name)
配置DTS迁移任务后,不勾选结构迁移,待迁移完成后查看目标库数据如下:目标库数据

可能原因

源库和目标库对字符集是否区分大小写的特性不一致。

解决方案

  • 业务上考虑是否存在内容相同仅大小写不同的情况,如不需要的话,将存入数据库的内容的大小写统一,例如都统一成小写的形式。
  • 若源库的大小写敏感,在选择目标库时,在目标端指定大小写敏感的字符序。