背景
新老项目切换,有些历史数据是来源于mongo导入,保证唯一的前提下兼容Mysql Long类型的id
Mongo ObjectId的组成
ObjectId是16进制编码
解决方法
Mongo ObjectId占用12字节,Mysql Long占用8个字节,首先将ObjectId的16进制转为2进制,再将12字节裁剪为8字节
- 考虑数据库都是一机一实例部署,去掉进程PID所占用的2个字节
- 考虑项目数据初始数据起始时间为2019年,裁剪时间戳的起始位:
- 将2019-01-01 00:00:00转为秒级时间戳1546272000
- 2022-10-01 00:00:00转为时间戳为1664553600
- 相减得到118281600
- 转为2进制为11_1000_0110_0110_1010_1100_0000,仅占2字节,不够字节的位数补10
- 最终为1011_1000_0110_0110_1010_1100_0000,转为10进制193358528
至此完成ObjectId到Mysql Long的映射
坑
数据库的顺序写入会被打破,影响性能,需要根据场景评估
或者缺少的两位不补位10,11_1000_0110_0110_1010_1100_0000转成10进制为59140800