我在试用SymmetricDS同步mysql时,中文出现了乱码,成为了??。经过一番尝试、研究,终于找到了原因。
我之前在mysql源库的jdbc连接中没有添加characterEncoding=utf8的参数,于是,SymmetricDS在自动创建的触发器,character_set_client是latin1。这样就使得通过触发器捕获到变化数据时,往sym_data表中插入的中文数据变成??。这样一来,同步到目标库中数据也是乱码了。
解决办法就是:
1、通过show triggers命令找到有问题的触发器,采用“drop trigger 触发器名”删除这些触发器。
2、在mysql源库的jdbc连接中添加characterEncoding=utf8的参数。(需要注意,参数之间的分隔符是&,而不是&;)
3、重启SymmetricDS服务,等待自动重建触发器。
4、目标库的jdbc连接中也添加characterEncoding=utf8的参数。
经过对中文乱码问题的处理,我摸清了SymmetricDS的一些原理,整理如下:
1、SymmetricDS根据我们添加的触发器配置信息,自动在源库中创建触发器(对每个表,创建3个触发器:I、U、D,只创建当前组所在路由相关的触发器),通过触发器自动捕获变化数据,写入sym_data表中。
2、SymmetricDS每次启动的时候,会去检查触发器、系统表是否完整,如果缺少,会自动创建。当然,可以通过db.config.database=false来关闭自动创建的过程。
3、SymmetricDS的代码中,针对不同的数据库,编写了不同的触发器创建模板,如对于mysql,表更新触发器模板为updateTriggerTemplate 。