mysql master-slave 日志传送时字段类型为decimal的问题

anndy 发布于 2012/02/17 08:40
阅读 844
收藏 0

最近发现一个很奇怪的问题,一直找不到原因,特来oschina求助

问题描述:

我们采用了mysql master-slave replication的模式去做读写分离,master中有一张表(tableA)的字段类型为lat decimal(7,4),master通过用户的web访问写入的数据都是正常的,如:23.4785,但是同步到slave中的数据就变成999.9999了。后来我们查看日志传送的记录发现sql变成这样了

update tableA set  lat=0x5429875657 where id=4758 //这里的0x5429875657是我随便写的,反正都是以0x开头

后来我们通过mysql的客户端直接用sql语句修改master的这张表,发现slave同步到的数据正常了

master sql语句为: update tableA set  lat=23.4785 where id=4758

查看日志传送的sql语句也为:update tableA set  lat=23.4785 where id=4758

salve同步到的数据正常。

 

后来我们怀疑是web端通过hibernate生成的sql语句有什么特殊的地方,所以我们打印出hibernate生成的sql语句

Hibernate: update  set lat=? where id =?

lat:23.02913  id4936

发现也没有什么特殊的地方,真的是搞不懂,反正通过hibernate这样一修改,master slave日志传送中的sql语句就是这样了

update tableA set  lat=0x5429875657 where id=4758


加载中
0
大东哥
大东哥
有可能是hibernate的数据类型和mysql数据类型不匹配,试试直接jdbc操作看看,猜的。
0
anndy
anndy

引用来自“大东哥”的答案

有可能是hibernate的数据类型和mysql数据类型不匹配,试试直接jdbc操作看看,猜的。
如果不匹配,为什么通过hibernate写入到master中的数据是正常的呢,只是replication到slave中的数据全部变成了999.9999
anndy
anndy
@大东哥 :问题已经解决,谢谢大东哥,解决方法,就是mysql中的decimal 通过hibernate对应为java中的Double类型就可以了,mysql的日志传送就正常了
大东哥
大东哥
@anndy : 警告信息已经很明显了。。。。 解决这个信息再讨论。
anndy
anndy
@大东哥 : master和slave的结构完全一样啊,把生成的日志传送中的sql捕获到update tableA set lat=0x39302E3031323032 where id=4936通过数据库客户端不管放在master还是slave中去执行都会报这个警告信息
大东哥
大东哥
@anndy : 问题就在这里了,如果你的sql_model设为严格模式,这就会变成错误,改不了数据,而不是警告。 还是我之前说的,类型问题。
anndy
anndy
@大东哥 : 有警告 Out of range value for column 'lat' at row 1
下一页
0
anndy
anndy

我搞不懂的是为什么通过hibernate修改后,日志传送是这样的语句

update tableA set  lat=0x5429875657 where id=4758

而通过mysql的客户端直接修改master中的decimal字段,日志传送就是这样的了

update tableA set  lat=23.4785 where id=4758

 

返回顶部
顶部