导出:撤销「给 ZISOCOUNTRYCODE 补空串」——实测空串会让真机拒绝整包

真机对照实验(同一份内容、同一台设备,唯一差异是这一列):

  国家码 = ''   → 备份恢复失败
  国家码 = NULL → **能导入**

也就是说我 2026-09-29 早些时候那个「按真机形状补空串」的改动是有害的回归:真机包里的确有 19 行是 '',
但**导入侧不接受**它(真机自己写出来的形状不代表它能吃回去)。恢复成按站点当前值原样写(新建地点没有
这一项 → NULL),与「被真机接受过的 A 包」一致。

教训记进注释:这一列不要做任何「形状美化」,保持 NULL。
This commit is contained in:
tamakyi
2026-09-29 15:18:28 +08:00
parent f98d3864b8
commit d5e96edbea
+4 -8
View File
@@ -256,15 +256,11 @@ func patchSQLite(ctx context.Context, db *sql.DB, datasetID int64, sqlitePath st
if p.Lat.Valid && p.Lon.Valid && !known["ZLOCATION"][p.SrcPK] { if p.Lat.Valid && p.Lon.Valid && !known["ZLOCATION"][p.SrcPK] {
rawLat, rawLon = geo.GCJ02ToWGS84(p.Lat.Float64, p.Lon.Float64) rawLat, rawLon = geo.GCJ02ToWGS84(p.Lat.Float64, p.Lon.Float64)
} }
// 国家码:真机这列从来不写 NULL(未知时写空串,实测 09-28 那份有 19 行是 ''), // 国家码写成 NULL,**不要**补空串:2026-09-29 实测——只把这一列从 NULL 改成 ''
// 而站点新建的地点没有这一项、导入时 '' 也被折叠成了 NULL —— 写回时按真机的形状补空串, // 就让真机从「能导入」变成「备份恢复失败」(同一份包、同一台设备,唯一差异就是这列)。
// 别把 NULL 塞回去(那又是它没见过的形状)。 // 站点新建的地点这一项本来就是 NULL,保持原样最安全。
country := ns(p.Country)
if country == nil {
country = ""
}
if err := loc.write(p.SrcPK, []any{ns(p.Name), ns(p.Category), nf(p.Lat), nf(p.Lon), if err := loc.write(p.SrcPK, []any{ns(p.Name), ns(p.Category), nf(p.Lat), nf(p.Lon),
country, ns(p.Province), ns(p.City), ns(p.Sublocality), ns(p.Thoroughfare), ns(p.Timezone), ns(p.Country), ns(p.Province), ns(p.City), ns(p.Sublocality), ns(p.Thoroughfare), ns(p.Timezone),
lastArrival, rawLat, rawLon}, lastArrival, rawLat, rawLon},
raw); err != nil { raw); err != nil {
return fmt.Errorf("写入地点失败: %w", err) return fmt.Errorf("写入地点失败: %w", err)