求 perl 高手,解决 pt-table-sync 的一个 json 字段的中文乱码问题

195 天前
 hetal

官方都 2 年了这个 bug 一直没有解决,看了一下 pt-table-sync 的 perl 代码,1 万多行,后面发现应该是 perl 的 DBI 的问题

1007 次点击
所在节点    程序员
12 条回复
xycc
194 天前
https://metacpan.org/pod/DBD::mysql#mysql_enable_utf8
源代码太长了,看不了,我搜了下 DBI->connect,只有一处,在 2256 行,你把上面 2229 行的 mysql_enable_utf8 改成 mysql_enable_utf8mb4 试试?
hetal
194 天前
@xycc 感谢,都试过了,有 2 ,3 个地方涉及到编码问题,都没有效果~~,他不是普通字段的编码问题,就只有 json 字段的编码问题~~
zhanglintc
193 天前
大概就是`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 是`中国`。但是我还是不知道怎么改。。。
感觉可能可以在这里自己编码一下。
zhanglintc
193 天前
改了下,简单测试 OK ,晚点改一版试试
zhanglintc
193 天前
试试这个改法,生成 sql 语句前直接手动改下编码。

链接: https://pan.baidu.com/s/1L0R4S6FHYzOpJQyBDNsHYg?pwd=xz3q 提取码: xz3q 复制这段内容后打开百度网盘手机 App ,操作更方便哦

文件版本不一定完全一致,参考着看一下。
zhanglintc
193 天前
存个测试代码:./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
hetal
193 天前
感谢,我试试
hetal
193 天前
确实可以了,真是感谢;
我觉得您可以给官方提一个 pull 啦,他们 2 年都没有搞定这个 bug 。
zhanglintc
193 天前
@hetal #8 我这个改法虽然解决了你这个问题,但是感觉不是特别好,真要提 PR 还得斟酌斟酌。
hetal
193 天前
@zhanglintc 您考虑得很周到,diff 了一下代码,是固定 utf8 编码,如果能动态根据 mysql 或 参数--charset 来判定,估计就能满足官方的需求了
zhanglintc
191 天前
Code uploaded into GitHub.
Permanent link see :https://github.com/zhanglintc/pt-table-sync-bug-fix
hetal
191 天前
@zhanglintc 赞~~~~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1039548

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX