V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
hetal
V2EX  ›  程序员

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

  •  
  •   hetal · 222 天前 · 1045 次点击
    这是一个创建于 222 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    12 条回复    2024-05-14 21:01:22 +08:00
    xycc
        1
    xycc  
       221 天前
    https://metacpan.org/pod/DBD::mysql#mysql_enable_utf8
    源代码太长了,看不了,我搜了下 DBI->connect,只有一处,在 2256 行,你把上面 2229 行的 mysql_enable_utf8 改成 mysql_enable_utf8mb4 试试?
    hetal
        2
    hetal  
    OP
       221 天前
    @xycc 感谢,都试过了,有 2 ,3 个地方涉及到编码问题,都没有效果~~,他不是普通字段的编码问题,就只有 json 字段的编码问题~~
    zhanglintc
        3
    zhanglintc  
       220 天前
    大概就是`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
        4
    zhanglintc  
       220 天前
    改了下,简单测试 OK ,晚点改一版试试
    zhanglintc
        5
    zhanglintc  
       220 天前
    试试这个改法,生成 sql 语句前直接手动改下编码。

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

    文件版本不一定完全一致,参考着看一下。
    zhanglintc
        6
    zhanglintc  
       220 天前
    存个测试代码:./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
        7
    hetal  
    OP
       220 天前
    感谢,我试试
    hetal
        8
    hetal  
    OP
       220 天前
    确实可以了,真是感谢;
    我觉得您可以给官方提一个 pull 啦,他们 2 年都没有搞定这个 bug 。
    zhanglintc
        9
    zhanglintc  
       220 天前
    @hetal #8 我这个改法虽然解决了你这个问题,但是感觉不是特别好,真要提 PR 还得斟酌斟酌。
    hetal
        10
    hetal  
    OP
       219 天前
    @zhanglintc 您考虑得很周到,diff 了一下代码,是固定 utf8 编码,如果能动态根据 mysql 或 参数--charset 来判定,估计就能满足官方的需求了
    zhanglintc
        11
    zhanglintc  
       218 天前
    Code uploaded into GitHub.
    Permanent link see :https://github.com/zhanglintc/pt-table-sync-bug-fix
    hetal
        12
    hetal  
    OP
       218 天前
    @zhanglintc 赞~~~~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4130 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 05:30 · PVG 13:30 · LAX 21:30 · JFK 00:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.