MySQL因字符集致使主从数据不一致

由于utf8mb4支持更多的字符,因此通常都使用utf8mb4字符集。在MySQL 8.0中默认字符集就已是utf8mb4了。可是,在MySQL 5.7中,默认的字符集仍是utf8。而这接下来的一切,正是在5.7中发生的。php

最近接了个任务,由于机房须要搬迁,须要迁移数据库。为了减小停机时间,经过主从切换方式进行。而又由于须要合并服务器,又采用了多源复制的手段。掂量了一下,以为仍是逻辑备份的方式方便。说干就干,先导出数据:mysqldump -u root -p'123456' --single-transaction --events --triggers --routines --master-data=2 --databases db1 db2 db3 --result-file='a001.sql'。导入数据后需校验一下数据,checksum table就挺好用了。从两端跑出来结果,一对比倒是不同的。捣鼓了半天,终于发现玄机。这里直接公布答案。html

为了方便描述,现将主从不一致结果放到一个库中展现:
MySQL因字符集致使主从数据不一致
虽然,查询结果看着是同样的,但倒是不同的数据。mysql

对应的表结构:
MySQL因字符集致使主从数据不一致sql

这里看到表的字符集是utf8mb4。对应的字符集设置:
MySQL因字符集致使主从数据不一致数据库

发现客户端的字符集和表的字符集是不一致的。修改客户端字符集后再查看:
MySQL因字符集致使主从数据不一致json

此时,就能够看到数据是不同的。服务器

回去看备份文件:
MySQL因字符集致使主从数据不一致ide

备份的链接用的是utf8。code

至此结案。接下来再备份导入看看效果mysqldump -u root -p'123456' --single-transaction --default-character-set=utf8mb4 --events --triggers --routines --master-data=2 --databases db1 db2 db3 --result-file='a001.sql'htm

然而,故事到这里尚未结束。还有一个Bug(table with json data type,checksum table result inconsistent)等着我。

相关文章
相关标签/搜索