源庫和目標庫的字符集對大小寫敏感度不一致時,通過DTS進行遷移或同步的過程中,可能會出現(xiàn)目標庫缺少數(shù)據(jù)的情況。本文介紹如何避免這種情況的發(fā)生。

問題描述

不同的數(shù)據(jù)庫對大小寫敏感度的要求會存在差異。當目標庫和源庫數(shù)據(jù)庫大小寫敏感度不一致時,可能會在遷移或同步結(jié)束后,發(fā)現(xiàn)目標庫缺少數(shù)據(jù)。

問題示例

以Oracle和MySQL為例,說明數(shù)據(jù)庫對大小寫敏感度要求不一致導致目標庫數(shù)據(jù)缺失的情況。

Oracle數(shù)據(jù)庫和MySQL數(shù)據(jù)庫對大小寫敏感度的要求不一致。

  • Oracle:區(qū)分大小寫,對主鍵或唯一鍵字段可以插入僅大小寫不同的值,如'a'和’A'。
  • MySQL:是否區(qū)分大小寫由字符序(COLLATE)決定。一般"_ci"表示大小寫不敏感;"_cs"表示大小寫敏感。當字符序后綴為"_ci"時不區(qū)分大小寫,主鍵或唯一鍵字段不能插入僅大小寫不同的值,如'a'和’A'。

遷移場景:從源庫Oracle向目標庫MySQL遷移數(shù)據(jù)。配置DTS遷移任務后,不勾選結(jié)構(gòu)遷移,遷移完成后,查看目標庫數(shù)據(jù)。

源庫和目標庫類型 字符集 遷移動作說明 源庫和目標庫數(shù)據(jù)
源庫:Oracle AL32UTF 遷移對象:gb.test
create table gb.test
(id int primary key, name varchar2(10))
查看源庫數(shù)據(jù)如下:源庫數(shù)據(jù)
插入數(shù)據(jù):

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
說明 默認大小寫不敏感。
自建以下表結(jié)構(gòu):
create table
test.test (auto_id int primary key auto_increment, name varchar(10), unique
key(name)
配置DTS遷移任務后,不勾選結(jié)構(gòu)遷移,待遷移完成后查看目標庫數(shù)據(jù)如下:目標庫數(shù)據(jù)

可能原因

源庫和目標庫對字符集是否區(qū)分大小寫的特性不一致。

解決方案

  • 業(yè)務上考慮是否存在內(nèi)容相同僅大小寫不同的情況,如不需要的話,將存入數(shù)據(jù)庫的內(nèi)容的大小寫統(tǒng)一,例如都統(tǒng)一成小寫的形式。
  • 若源庫的大小寫敏感,在選擇目標庫時,在目標端指定大小寫敏感的字符序。