Excel打开看不出问题,ERP导入却提示第一个SKU不存在。用十六进制看文件开头常会发现EF BB BF,BOM被下游当成SKU的三个字节。

先把现象钉死

先用一个真实失败样本复现,不要一上来全量重建。把请求、实体ID和时间记下来,后面的SQL与日志才能对得上。

现场检查

  • 不要只用文本编辑器,直接查看文件头字节。
  • 确认问题只在第一行第一列,还是分隔符、引号和换行也不兼容。
xxd -l 16 export.csv
file -bi export.csv
head -1 export.csv | od -An -tx1
sed -i "1s/^\xEF\xBB\xBF//" export.csv

为了避免把环境差异当成根因,我会先在预发布或数据库副本复现;涉及订单、库存和支付的操作,正式环境只做只读核对,修复脚本必须带明确的订单号或SKU范围。

实际修复

如果ERP明确要求UTF-8无BOM,在生成流的最前面不要输出BOM;若文件来自第三方模块,定位写入chr(0xEF).chr(0xBB).chr(0xBF)的位置并改为可配置。临时处理可只移除文件开头一次,不能全局删除同字节序列。并统一逗号、双引号转义与CRLF要求。

实施时的顺序

  • 先在单个SKU、单个订单或单个Store验证。
  • 保留可回退的旧配置,不覆盖原始证据。
  • 需要批量处理时分批提交并输出成功/失败清单。

怎么确认没有假好

  • xxd开头直接是SKU表头字节
  • 包含中文名称仍是UTF-8
  • 带逗号和引号的字段可往返
  • ERP测试文件成功导入

验收不只看后台提示“成功”。我还会从前台/API再走一次真实链路,并在下一轮cron、索引或缓存命中后重复检查,确认不是短暂正常。

留一个坑位提醒

BOM不是“乱码修复开关”,有些Excel流程反而依赖它,应该按消费方生成不同导出配置。