美文网首页
数据同步之bit字段

数据同步之bit字段

作者: 沐一同学 | 来源:发表于2021-03-19 19:16 被阅读0次

背景:
公司自研同步服务,先执行全量同步,补充增强数据,达到同步数据的目的。

问题:
用户消费的时候,发现这个字段(列)的数据有问题;
说增量的消费没有问题,奇怪。

原因:
全量遇到bit字段,导出的时候当做varchar处理了,转成base64格式的字符串;用户解析遇到非数字字符串。
而增量数据解析的binlog返回的bit列,对应的类型是mysql_type_longlong

处理:
弄了一下拉取的数据,都是会处理string。
本来以为直接翻译成mysql_type_longlong类型就可以了,然后紧急发布,发现总是有问题。
无法解析的字符串"\x00\x01"。

服务器返回的类型是特殊字符串;

思路1:
后面就一致想着把返回的"\x00\x01"字符串,翻译成"01",在转成uint64;
调试了半天出不来,后续输出单步调试,发现出现"\x00\x07",纳尼。。。

此路不通。

复盘
最后发现弄了半天的东西,原来是最简单,服务器返回的就是uint64的字节序;而且是按照bit的顺序,中间转义
处理的时候,依然是原始的[]byte字节序。

思路2:
自己去解析uint64值,不用走弯弯绕绕。踏破铁鞋无觅处,得来全不费工夫。原来是如此简单,我搞了半天。

func bytes2uint64Special(bs []byte) uint64 {
    var v uint64 = 0

    for _, b := range bs {
        v = v * 256 + uint64(b)
    }
    return v
}

然后再编码输出的Queue中,供消费;

最终代码

func bytes2uint64(bs []byte) uint64 {
    var data uint64

    switch len(bs) {
    case 2:
        data = uint64(binary.BigEndian.Uint16(bs))
    case 4:
        data = uint64(binary.BigEndian.Uint32(bs))
    case 8:
        data = binary.BigEndian.Uint64(bs)
    default:
        data = bytes2uint64Special(bs)
    }

    return data
}

相关文章

  • 数据同步之bit字段

    背景:公司自研同步服务,先执行全量同步,补充增强数据,达到同步数据的目的。 问题:用户消费的时候,发现这个字段(列...

  • TCP协议格式、三次握手和四次挥手

    TCP协议数据格式 注:字段后面括号中的数字是指该字段在TCP头部信息中所占的位(bit)数。

  • 触发器

    数据同步增加:如有两张表——A表和B表,创建触发器使当A表插入数据后B表也同步插入数据。其中B表插入数据的字段需要...

  • Oracle GoldenGate (OGG)新增表同步数据的流

    变更场景 已同步的表结构变更,包括添加字段,删除字段,修改字段类型和字段长度 新增同步表 变更流程 一、已同步表结...

  • MySQL字段数据类型表

    数值类型BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。作为SQL标准的扩...

  • IP协议

    IP首部不含有选项的情况下IP首部占20个字节,主要字段如下: 版本号:4bit 首部长度:4bit 数据报总长度...

  • MySql之自动同步表结构

    MySql之自动同步表结构 开发痛点 在开发过程中,由于频繁的修改数据库的字段,导致rd和qa环境的数据库表经常不...

  • FMDB数据库更新 ios

    升级数据库之添加字段

  • kettle 数据同步

    数据同步一般要与 排序记录、合并记录 两个对象同时使用 首先确保数据流的字段是一样的,可利用 字段选择 的移除和排...

  • 2018-08-30 PHP Mysql 读写分离 数据同步

    Mysql主从同步,集群,读写分离,都会涉及数据的数据同步,所以想玩哪些东西,我们还是要把这个数据同步的基础学会之...

网友评论

      本文标题:数据同步之bit字段

      本文链接:https://www.haomeiwen.com/subject/ffjbcltx.html