官方都 2 年了这个 bug 一直没有解决,看了一下 pt-table-sync 的 perl 代码,1 万多行,后面发现应该是 perl 的 DBI 的问题
1
xycc 195 天前
https://metacpan.org/pod/DBD::mysql#mysql_enable_utf8
源代码太长了,看不了,我搜了下 DBI->connect,只有一处,在 2256 行,你把上面 2229 行的 mysql_enable_utf8 改成 mysql_enable_utf8mb4 试试? |
3
zhanglintc 194 天前
大概就是`sub process_rows`方法 3564 行那里,拼出来的$sql 有问题:
以官方那个 bug 为例: ``` DB<3> x $sql 0 'UPDATE `pt-sync`.`t_article` SET `topics`=\'["中国", "美国", "China", "USA"]\', `title`=\'\x{6D4B}\x{8BD5}\x{4E2D}\x{6587} test Chinese\' WHERE `pk_article`=\'11\' LIMIT 1' ``` 很明显 title 那里是类似`\x{6D4B}`的字符串,而 topics 是`中国`。但是我还是不知道怎么改。。。 感觉可能可以在这里自己编码一下。 |
4
zhanglintc 194 天前
改了下,简单测试 OK ,晚点改一版试试
|
5
zhanglintc 194 天前
试试这个改法,生成 sql 语句前直接手动改下编码。
链接: https://pan.baidu.com/s/1L0R4S6FHYzOpJQyBDNsHYg?pwd=xz3q 提取码: xz3q 复制这段内容后打开百度网盘手机 App ,操作更方便哦 文件版本不一定完全一致,参考着看一下。 |
6
zhanglintc 194 天前
存个测试代码:./pt-table-sync --verbose --execute --databases 'pt-sync' h=192.168.33.10,P=3306,u=root,p=@Az123456 h=192.168.33.11,P=3306,u=root,p=@Az123456
|
7
hetal OP 感谢,我试试
|
8
hetal OP 确实可以了,真是感谢;
我觉得您可以给官方提一个 pull 啦,他们 2 年都没有搞定这个 bug 。 |
9
zhanglintc 193 天前
@hetal #8 我这个改法虽然解决了你这个问题,但是感觉不是特别好,真要提 PR 还得斟酌斟酌。
|
10
hetal OP @zhanglintc 您考虑得很周到,diff 了一下代码,是固定 utf8 编码,如果能动态根据 mysql 或 参数--charset 来判定,估计就能满足官方的需求了
|
11
zhanglintc 192 天前
Code uploaded into GitHub.
Permanent link see :https://github.com/zhanglintc/pt-table-sync-bug-fix |
12
hetal OP @zhanglintc 赞~~~~
|