链路平台按 traceId 查不到库里的记录,库里存的 trace_id 都是 32 位,日志里的是 64 位十六进制,后 32 位被补成 0。字段定义是 varchar(32),插入时没报错。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,MySQL 严格模式没开,超长字符串被静默截断,只在 warning 里留一条 1265。traceId 用 64 位十六进制后正好触发。截断后的值还能插入,按完整 ID 查询永远命不中。

「traceId 字段截断」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

ALTER TABLE orders MODIFY trace_id VARCHAR(64) NOT NULL DEFAULT '';
SHOW VARIABLES LIKE 'sql_mode';
SELECT trace_id, LENGTH(trace_id) FROM orders ORDER BY id DESC LIMIT 3;

权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

具体做法是,把字段长度改成 varchar(64) 并确认字符集一致;开启严格模式 让截断直接报错而不是静默;写入前在应用层校验长度 超长就拒绝;用一条新请求核对库里的值和日志里的值完全一致。

最后用这个标准收尾,新订单的 trace_id 长度是 64,和日志里打印的字符串逐位相同。

作者 9823189