我使用DRS同步MySQL Float类型数据到PostgreSQL,为什么两边数据"不一致"
最近收到一个客户反馈使用DRS同步后,源库和目标库的数据不一致。数据一致性是DRS的生存之本,团队上下非常重视,收到反馈后马上联系客户了解情况排查原因,最终发现原来是虚惊一场。那么这个“不一致”是怎么产生的?它底层的根本原因又是什么呢?接下来我们一起来挖一挖。
问题现象
客户使用DRS创建了MySQL到PostgreSQL的同步任务,MySQL表中存在一个FLOAT类型的列,DRS任务启动后会在PostgreSQL中对应创建一个FLOAT4的列。同步过程中在MySQL中插入一条FLOAT列值为3.1415926的数据,同步后在源库MySQL中SELECT出来的数据是3.14159,而在目标库PostgrSQL中SELECT出来却是3.1415925。
复现步骤:
- 在源库建表:
CREATE TABLE `float_test` ( `id` int(11) primary key, `id2` float ) ENGINE=InnoDB DEFAULT CHARSET=utf8
- 创建DRS任务,同步这张表的数据到PostgreSQL。目标库会自动创建下表:
CREATE TABLE "root"."float_test" ( "id" int PRIMARY KEY, "id2" FLOAT4 )
- 在源库insert数据:
insert into `float_test` values (1, 3.1415926);
- 数据同步之后
通过mysql客户端查询:
通过postgresql客户端查询:
而通过jdbc查询:
mysql:
postgresql:
问题原因:
mysql底层存储3.1415926的时候,binlog中记录的数据为3.1415925,DRS从binlog中解析出来数据,同步到PostgrSQL的也是3.1415925。
而通过mysql的driver进行select的时候,mysql driver对数据进行了截断,所以查出来是3.14159,而PostgrSQL的driver没有进行截断,导致通过两种driver select出的数据不一致。
如果不想让driver截断,可以在jdbc的url中增加useServerPrepStmts=true的option。
- 点赞
- 收藏
- 关注作者
评论(0)