-- 2026-08-11 区域二值化:app_registry.region 统一成 cn(国内)/ hw(海外) -- -- 背景:后台的部署表单早期把中文区域名('中国'/'美国'/'东亚'…)直接存进 app_registry.region, -- 而一个应用实际只有「国内 / 海外」两套环境。后台已改为只提供这两档, -- 前端对历史值做展示归一,但库里留着杂值会让「已用区域去重」「按区域筛选」继续踩坑,这里一次清干净。 -- -- 只对 **console 主库**(app_registry 所在库,即 supabase 那套)执行。幂等,可重复跑。 -- 注意:本脚本不动 stats_global_day.region —— 那列存的是各部署 analyze 上报的细分区域码 -- (cn/us/ea/…,见 services/comm/region.go),后端查询时会把 hw 展开成「除 cn 外的全部码」来兼容。 BEGIN; -- 1) 国内:cn / 中国 / 国内(大小写不敏感) UPDATE app_registry SET region = 'cn', updatetime = EXTRACT(EPOCH FROM now())::bigint WHERE lower(btrim(region)) IN ('cn', 'china', '中国', '国内') AND region <> 'cn'; -- 2) 海外:其余所有非空值(us/ea/sea/… 与 '美国'/'东亚'… 等中文名) UPDATE app_registry SET region = 'hw', updatetime = EXTRACT(EPOCH FROM now())::bigint WHERE btrim(coalesce(region, '')) <> '' AND region NOT IN ('cn', 'hw'); -- 3) 账号绑定的区域 CSV(console_account.regions)同样归一: -- 含 cn 的保留 cn,其余非空码折成 hw,去重后写回。 UPDATE console_account a SET regions = sub.norm FROM ( SELECT id, (SELECT string_agg(DISTINCT r2, ',' ORDER BY r2) FROM ( SELECT CASE WHEN lower(btrim(r)) IN ('cn', 'china', '中国', '国内') THEN 'cn' ELSE 'hw' END AS r2 FROM unnest(string_to_array(regions, ',')) AS r WHERE btrim(r) <> '' ) t ) AS norm FROM console_account WHERE coalesce(btrim(regions), '') <> '' ) sub WHERE a.id = sub.id AND sub.norm IS NOT NULL AND a.regions <> sub.norm; COMMIT; -- 核对 -- SELECT id, name, app_name, region FROM app_registry ORDER BY app_name, region; -- SELECT id, name, regions FROM console_account WHERE coalesce(regions,'') <> '';