From d5e96edbea0b3a6232e23fe109eaf092fc86c76e Mon Sep 17 00:00:00 2001 From: tamakyi Date: Tue, 29 Sep 2026 15:18:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=BC=E5=87=BA=EF=BC=9A=E6=92=A4=E9=94=80?= =?UTF-8?q?=E3=80=8C=E7=BB=99=20ZISOCOUNTRYCODE=20=E8=A1=A5=E7=A9=BA?= =?UTF-8?q?=E4=B8=B2=E3=80=8D=E2=80=94=E2=80=94=E5=AE=9E=E6=B5=8B=E7=A9=BA?= =?UTF-8?q?=E4=B8=B2=E4=BC=9A=E8=AE=A9=E7=9C=9F=E6=9C=BA=E6=8B=92=E7=BB=9D?= =?UTF-8?q?=E6=95=B4=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 真机对照实验(同一份内容、同一台设备,唯一差异是这一列): 国家码 = '' → 备份恢复失败 国家码 = NULL → **能导入** 也就是说我 2026-09-29 早些时候那个「按真机形状补空串」的改动是有害的回归:真机包里的确有 19 行是 '', 但**导入侧不接受**它(真机自己写出来的形状不代表它能吃回去)。恢复成按站点当前值原样写(新建地点没有 这一项 → NULL),与「被真机接受过的 A 包」一致。 教训记进注释:这一列不要做任何「形状美化」,保持 NULL。 --- internal/rond/export.go | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/internal/rond/export.go b/internal/rond/export.go index da5de33..73dcaa1 100644 --- a/internal/rond/export.go +++ b/internal/rond/export.go @@ -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] { rawLat, rawLon = geo.GCJ02ToWGS84(p.Lat.Float64, p.Lon.Float64) } - // 国家码:真机这列从来不写 NULL(未知时写空串,实测 09-28 那份有 19 行是 ''), - // 而站点新建的地点没有这一项、导入时 '' 也被折叠成了 NULL —— 写回时按真机的形状补空串, - // 别把 NULL 塞回去(那又是它没见过的形状)。 - country := ns(p.Country) - if country == nil { - country = "" - } + // 国家码写成 NULL,**不要**补空串:2026-09-29 实测——只把这一列从 NULL 改成 '' + // 就让真机从「能导入」变成「备份恢复失败」(同一份包、同一台设备,唯一差异就是这列)。 + // 站点新建的地点这一项本来就是 NULL,保持原样最安全。 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}, raw); err != nil { return fmt.Errorf("写入地点失败: %w", err)