源表 remark 是 varchar(64),目标表建成了 varchar(32)。同步程序没报错,21 万行备注只剩前 32 个字符,末尾的跟进记录全没了。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

SELECT @@sql_mode;
SELECT id, CHAR_LENGTH(remark) len FROM src_order
WHERE CHAR_LENGTH(remark) > 32 LIMIT 50;

MySQL 在非严格模式下把超长字符串静默截断,只发一条 warning。同步链路用的是批量 insert,warning 不会中断任务,返回值照旧是成功。字段长度这类差异,跑一年都不会自己暴露出来。这一点先确认清楚,后面就不用反复试。

「同步字段截断」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

改完隔一天再看一次,当场正常不代表能稳住。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

具体做法是,先查 sql_mode 里有没有 STRICT_ALL_TABLES;把目标表字段长度按源表对齐 留一点余量;同步前加一步长度校验 SQL 把超长的行捞出来;批量写入时把 warning 转成 error。

改完照着核一遍,超长行数降到 0 抽样比对备注全文和源库一致。

作者 9823189