监听 mysql binlog 获取到的行数据,如何获取到对应的字段的名称

创建一个数据库 test

create database test;

使用 test 数据库

use test;

创建一个表 test1

create table test1 (field1 varchar(10),field2 int);

创建一个表 test2

create table test2(field1 varchar(2),field2 varchar(2),field3 varchar(3),field4 varchar        (4));

从 information_schema.COLUMNS 表中筛选出 TABLE_SCHEMA 是库名 test 的数据,根据 表名 和 序号进行排序

SELECT TABLE_NAME , COLUMN_NAME, DATA_TYPE, CHARACTER_SET_NAME, ORDINAL_POSITION, COLUMN_TYPE, COLUMN_KEY FROM `information_schema`.`COLUMNS` WHERE TABLE_SCHEMA = 'test' ORDER BY TABLE_NAME, ORDINAL_POSITION;

得到的数据中,列的名称是顺序的

+------------+-------------+-----------+--------------------+------------------+-------------+------------+

| TABLE_NAME | COLUMN_NAME | DATA_TYPE | CHARACTER_SET_NAME | ORDINAL_POSITION | COLUMN_TYPE | COLUMN_KEY |

+------------+-------------+-----------+--------------------+------------------+-------------+------------+

| test1      | field1      | varchar  | latin1            |                1 | varchar(10) |            |

| test1      | field2      | int      | NULL              |                2 | int(11)    |            |

| test2      | field1      | varchar  | latin1            |                1 | varchar(2)  |            |

| test2      | field2      | varchar  | latin1            |                2 | varchar(2)  |            |

| test2      | field3      | varchar  | latin1            |                3 | varchar(3)  |            |

| test2      | field4      | varchar  | latin1            |                4 | varchar(4)  |            |

+------------+-------------+-----------+--------------------+------------------+-------------+------------+

test2 中插入一条数据

insert into test2 values('l','zw','dp','19');

监听到的 binlog 时间如下

Event{header=EventHeaderV4{timestamp=1586509755000, eventType=EXT_WRITE_ROWS, serverId=1, headerLength=19, dataLength=28, nextPosition=2745, flags=0}, data=WriteRowsEventData{tableId=223, includedColumns={0, 1, 2, 3}, rows=[ [[B@1e80bfe8, [B@66a29884, [B@4769b07b, [B@cc34f4d] ]}}

includedColumns={0, 1, 2, 3} 表示有四列

rows=[ [[B@1e80bfe8, [B@66a29884, [B@4769b07b, [B@cc34f4d] ] 表示一行数据中

为了能够将字段值对应的字段名称取出

必须按照 `information_schema`.`COLUMNS` 查询的结果,遍历指定表的所有字段,同时维护一个索引标记,

用这个索引标记,从 includedColumns 中获取对应的波尔值,以判断,这个列在数据中是否存在

如果存在,使用索引标记 从表示单元格数据的数组中取得对应的值作为 value,当前 列的名称作为 key

如果不存在的话,把 null 当作 value,当前列的名称作为 key

添加到一个 map 中,以此来达到每隔字段值都有对应的名字

java 代码

private void writeData(Table table, RowMap row, Serializable[] data, BitSet includedColumns) {

int dataIdx = 0, colIdx = 0;

for ( ColumnDef cd : table.getColumnList() ) {

if ( includedColumns.get(colIdx) ) {

Object json = null;

if ( data[dataIdx] != null ) {

json = cd.asJSON(data[dataIdx]);

}

row.putData(cd.getName(), json);

dataIdx++;

}

colIdx++;

}

}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 13,172评论 0 13
  • 什么是数据库? 数据库是存储数据的集合的单独的应用程序。每个数据库具有一个或多个不同的API,用于创建,访问,管理...
    chen_000阅读 9,468评论 0 19
  • 一,认识MySQL语言 1.MySQL语言主要用于存取数据,查询数据,更新数据和管理关系数据库系统2.DDL语句 ...
    如约而至_8286阅读 4,605评论 0 3
  • 一. Java基础部分.................................................
    wy_sure阅读 9,281评论 0 11
  • 摘要:在MySQL的使用过程中,了解字符集、字符序的概念,以及不同设置对数据存储、比较的影响非常重要。不少同学在日...
    暖夏未眠丶阅读 4,200评论 0 2

友情链接更多精彩内容