MySQL跟OB 唯一性约束问题

【 使用环境 】生产环境
【 OB or 其他组件 】OBCE-4.2.2
【 使用版本 】OBCE-4.2.2
【问题描述】迁移MySQL8.0.x 到 OBCE-4.2.2,迁移期间有数据丢失,发现ob 唯一性约束跟mysql 行为有差异。
1、mysql 唯一性约束 不检查 ‘’ ,而ob会检查,导致数据丢失;
2、mysql 唯一约束检查 对大小写 ,而ob 不检查 大小写,导致数据丢失;
【复现路径】


CREATE TABLE `alm_i18n_data` (
  `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `LANG_ID` int(11) NOT NULL,
  `CODE` varchar(255) DEFAULT NULL,
  `VALUE` varchar(255) DEFAULT NULL,
  `MODIFIED_BY` varchar(100) DEFAULT NULL,
  `MODIFIED_DATE` datetime DEFAULT NULL,
  `type` varchar(100) NOT NULL DEFAULT '',
  PRIMARY KEY (`ID`),
  UNIQUE KEY `uniq_code_type_langid` (`CODE`, `type`, `LANG_ID`)

)

mysql uniq_code_type_langid唯一性约束不检查 type NULL 的列,到了OB 认为 NULL = NULL 造成数据丢失;
mysql uniq_code_type_langid 唯一性约束 对大小写检查,而ob认为 大小写 一样,违反唯一性约束,导致数据丢失。

2 个赞

对于 i18n 表,ob 认为如下两条数据是一样的,违反唯一性约束;

alm_i18n_data 表结构

CREATE TABLE `alm_i18n_data` (
  `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `LANG_ID` int(11) NOT NULL,
  `CODE` varchar(255) DEFAULT NULL,
  `VALUE` varchar(255) DEFAULT NULL,
  `MODIFIED_BY` varchar(100) DEFAULT NULL,
  `MODIFIED_DATE` datetime DEFAULT NULL,
  `type` varchar(100) NOT NULL DEFAULT '',
  PRIMARY KEY (`ID`),
  UNIQUE KEY `uniq_code_type_langid` (`CODE`, `type`, `LANG_ID`)
) 

ob 认为 这两条数据是一样的,违反唯一性约束

2 个赞

第二个问题应该是字符序的问题,如果是utf8mb4_bin这个字符序对于数据就是大小写敏感的

OceanBase分布式数据库-海量数据 笔笔算数

2 个赞

您确认下您的数据库表的 字符集和编码规则?

mysql的数据库字符集和编码规则如下:

  1. 库继承实例的
    2.表继承库的
    3.列继承表的
    4.都可以进行个性化设置
    ######################
    如果因为大小写造成的唯一性的问题可以更改编码规则看看
3 个赞

另友情提示下数据迁移问题

  1. 数据库对应表的字符集和编码问题 ,程序应用可能导致乱码等问题
  2. 注意特殊字符的兼容性问题
  3. 注意数据库行数,数据迁移可能会导致数据丢失
  4. 时间时区的问题 ,timestamp列随着时区的变化展示也不一样。
    5.注意字符类型的 列截取问题
    祝您迁移成功
2 个赞

正解

2 个赞

谢谢!迁移 一波三折 惊心动魄

2 个赞