背景
最近在负责的一个大数据产品项目中,有一个数据推送/同步数据的功能。即,支持将数据以查询SQL的形式从数据源A查询出来,然后写入到数据源B中。用户提交的SQL,并未做仅能查询的限制,也就是说,可以在SQL里面写,insert overwrite等数据更新的逻辑。
问题报错
生产环境的MySQL数据同步到预发环境。为了实现数据推送的功能,推送到目标数据源的数据,即期望插入到预发环境的表,表的数量和类型,应该和数据源A的查询字段,也就是生产环境的表字段,能够匹配上。
目标数据源的表字段如果少于源头数据源的表字段,则源头数据源查询出来的数据被忽略,不会存储到目标数据源里。
当然,目的数据源的数据表字段允许多余源头数据源的数据表字段,这些多余的字段,由于在数据源头并没有定义,在目标数据源里会被设置为null,或是表字段定义的default值。
业务同学反馈数据同步失败,预发环境的数据不对。
从数据源A获取数据的SQL语句为:
select
id,name,sort,type,url,inserttime,updatetime,isactive
from
rhinoce_menu
排查
对比一下两个数据源的表结构定义,注意到只有一个字段和源头的数据表字段不一样,就是type,无意间发现其类型为tinyint(1)
,隐隐约约感觉定位到问题根源。参考Mybatis笔记之tinyint自动转型为boolean
验证
本地修改一下测试数据表的字段类型为tinyint(1)
,
也就是说,查询得到的数据,本来应该是1或0,经过MyBatis的转化,变成True/False。
参考
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/142145.html