源库和目标库的字符集对大小写敏感度不一致时,通过DTS进行迁移或同步的过程中,可能会出现目标库缺少数据的情况。本文介绍如何避免这种情况的发生。
问题描述
不同的数据库对大小写敏感度的要求会存在差异。当目标库和源库数据库大小写敏感度不一致时,可能会在迁移或同步结束后,发现目标库缺少数据。
问题示例
以Oracle和MySQL为例,说明数据库对大小写敏感度要求不一致导致目标库数据缺失的情况。
Oracle数据库和MySQL数据库对大小写敏感度的要求不一致。
- Oracle:区分大小写,对主键或唯一键字段可以插入仅大小写不同的值,如'a'和’A'。
- MySQL:是否区分大小写由字符序(COLLATE)决定。一般"_ci"表示大小写不敏感;"_cs"表示大小写敏感。当字符序后缀为"_ci"时不区分大小写,主键或唯一键字段不能插入仅大小写不同的值,如'a'和’A'。
迁移场景:从源库Oracle向目标库MySQL迁移数据。配置DTS迁移任务后,不勾选结构迁移,迁移完成后,查看目标库数据。
源库和目标库类型 | 字符集 | 迁移动作说明 | 源库和目标库数据 |
---|---|---|---|
源库:Oracle | AL32UTF | 迁移对象:gb.test
|
查看源库数据如下: |
插入数据:
|
|||
目标库:MySQL | utf8
说明 默认大小写不敏感。
|
自建以下表结构:
|
配置DTS迁移任务后,不勾选结构迁移,待迁移完成后查看目标库数据如下: |
可能原因
源库和目标库对字符集是否区分大小写的特性不一致。
解决方案
- 业务上考虑是否存在内容相同仅大小写不同的情况,如不需要的话,将存入数据库的内容的大小写统一,例如都统一成小写的形式。
- 若源库的大小写敏感,在选择目标库时,在目标端指定大小写敏感的字符序。