☰
全国行政区划代码表:3050条记录四种格式选型与地址匹配实战
2026/10/12 5:46:42 网站建设 项目流程

简介:全国行政区划代码表数据库面向GIS开发、统计分析、地址标准化及物流路径规划等场景的开发者与数据分析人员,提供从国家级到县区级的标准化行政编码体系,共收录3050条记录。资源包为zip格式,内含4个文件,涵盖json、xlsx、csv、sql四种主流格式:SQL文件可直接导入MySQL、Oracle等数据库进行查询分析,JSON以键值对形式便于Web应用与API接口交互,CSV适合Excel打开编辑及各类编程语言处理,XLSX则以表格形式支持排序、过滤与计算。压缩包整体约201KB,体积轻巧便于快速部署。目前已有2026人学习下载,适合需要快速接入行政区划数据的开发与统计工作。使用时需注意数据来源于网络整理,可能存在误差,建议结合权威来源校验,并关注行政区划变更带来的更新维护需求。

1. 全国行政区划代码表:3050 条记录、四种格式,到底该怎么选

做地址标准化、物流分单或者 BI 看板的朋友大概率都遇到过同一个问题:用户填的「广东省深圳市南山区」和系统里的「南山区」对不上,或者邮编匹配时发现同一个城市名对应了三个不同的行政代码。这类问题的根子往往不在业务逻辑,而在你手里那张行政区划代码表是不是完整、是不是最新、格式是不是顺手。全国行政区划代码表(数据库)这份资源,本质就是把国家到县区级的行政单位编码整理成了一份可直接落库、可解析、可导入 Excel 的数据集,一共 3050 条记录,同时给了 SQL、JSON、CSV、XLS 四种格式。它适合做 GIS 底表、地址清洗、统计口径对齐、物流路径规划的人,也适合刚接触数据库增删改查、想拿一份真实数据练手的新手。下面我按「这份资源怎么用起来」的顺序,把选型、导入、校验和踩坑一条条拆开讲。

2. 四种格式怎么选:从 SQL 建表到 JSON 嵌套的取舍

拿到压缩包先别急着全导一遍,四种格式对应的是四类完全不同的使用场景,选错了后面全是返工。这一章先把每种格式的字段结构、适用边界和导入方式讲清楚,再落到具体操作。

2.1 先看清字段结构:code、level、name 三列是骨架

不管哪种格式,核心字段基本是三个:code(行政代码)、level(级别,国家级/省级/市级/县级)、name(行政区域名称)。SQL 和 CSV 里通常是扁平的列,JSON 里是键值对对象。理解这一点很关键,因为后面做地址匹配时,你大概率要按code前两位切省级、前四位切市级,这是行政区划代码的编码规则决定的——前两位是省级,中间两位是市级,后两位是县级,一共六位。

格式典型字段适合场景导入难度
SQLcode, level, name直接建表、联表查询低
CSVcode, level, nameExcel 打开、脚本批处理低
JSONcode, level, nameWeb 接口、前后端交互中
XLScode, level, name人工查看、排序筛选低

选型逻辑很简单:要进数据库做联表分析就选 SQL,要喂给前端或 API 就选 JSON,要快速用 pandas 处理就选 CSV,要给非技术同事看就选 XLS。别四种都导,维护起来是灾难。

2.2 SQL 格式导入:建表语句和字符集是第一个坎

SQL 文件最常见的用法是直接 source 进 MySQL 或 PostgreSQL。但直接导入经常翻车,原因是字符集和字段长度没对齐。我一般会先手动建表,再导入数据,这样可控。

-- 手动建表,避免导入时字段类型不匹配 CREATE TABLE administrative_division ( code VARCHAR(12) NOT NULL COMMENT '行政代码', level VARCHAR(16) NOT NULL COMMENT '级别:国家级/省级/市级/县级', name VARCHAR(64) NOT NULL COMMENT '行政区域名称', PRIMARY KEY (code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- 导入 CSV 数据(比直接 source SQL 更可控) LOAD DATA LOCAL INFILE 'administrative_division.csv' INTO TABLE administrative_division FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 ROWS;

这里code用VARCHAR而不是INT,是因为行政代码有前导零的可能,用整型会把110000存成110000没问题,但某些县级代码如果被当成数字处理,前导零会丢。utf8mb4是为了兼容生僻地名里的多字节字符。IGNORE 1 ROWS跳过 CSV 表头,如果你的文件没有表头就去掉这行。导入后先SELECT COUNT(*)确认是不是 3050 条,数量对不上说明有行被截断或分隔符冲突。

2.3 JSON 与 CSV 的解析:pandas 和原生解析的差别

CSV 用 pandas 一行搞定,但要注意编码。国内整理的数据集经常是 GBK 或 UTF-8 with BOM,直接读会报UnicodeDecodeError。

import pandas as pd # 常见坑:编码不对会直接抛异常,先试 utf-8-sig df = pd.read_csv('administrative_division.csv', encoding='utf-8-sig', dtype={'code': str}) print(df.shape) # 期望 (3050, 3) print(df['level'].value_counts()) # 看各级别分布是否合理 # JSON 解析:注意可能是数组或按层级嵌套 import json with open('administrative_division.json', 'r', encoding='utf-8') as f: data = json.load(f) # 如果是扁平数组,直接转 DataFrame df_json = pd.DataFrame(data)

dtype={'code': str}是血泪经验,不加的话 pandas 会把代码列推断成 int64,前导零和后续字符串匹配都会出问题。value_counts()用来快速验证数据分布,正常情况下省级 30 多个、市级 300 多个、县级 2800 多个,如果某一级数量明显异常,说明数据有缺失或重复。

2.4 XLS 格式的定位:别拿它当数据源

XLS 最大的价值是给人看,不是给程序读。用 openpyxl 或 xlrd 读 XLS 比读 CSV 慢一个数量级,而且容易遇到合并单元格、格式行等干扰。我的习惯是:XLS 只用来人工核对几条关键记录,真正的数据源永远用 CSV 或 SQL。如果你非要用程序读,记得指定sheet_name,别默认读第一个 sheet 就完事。

3. 把代码表接进业务:地址匹配、层级查询与增量更新

数据导进来只是第一步,真正体现价值的是拿它做地址标准化和层级查询。这一章讲三个高频操作:用代码前缀做层级过滤、用名称做模糊匹配、以及行政区划变更时怎么增量维护。

3.1 用代码前缀做层级查询:一条 SQL 搞定省市区

行政区划代码的编码规则是「省 2 位 + 市 2 位 + 县 2 位」,所以查某个省下面所有市,直接按前两位过滤就行。这比按名称匹配可靠得多,因为名称会有「市」「地区」「自治州」等后缀差异。

-- 查广东省(44)下所有市级单位 SELECT code, name FROM administrative_division WHERE level = '市级' AND LEFT(code, 2) = '44'; -- 查深圳市(4403)下所有县级单位 SELECT code, name FROM administrative_division WHERE level = '县级' AND LEFT(code, 4) = '4403'; -- 统计每个省下有多少个县级单位 SELECT LEFT(code, 2) AS province_code, COUNT(*) AS county_count FROM administrative_division WHERE level = '县级' GROUP BY LEFT(code, 2) ORDER BY county_count DESC;

LEFT(code, 2)和LEFT(code, 4)是核心,它利用了编码的位置语义。注意level字段的值要和数据里的实际写法一致,有的数据集写「省」「市」「县」,有的写「省级」「市级」「县级」,导入后先SELECT DISTINCT level看一眼,别想当然。

3.2 名称模糊匹配:地址清洗里最容易翻车的一步

用户输入的地址千奇百怪,「深圳南山区」「南山区」「深圳市南山区」都可能出现。做匹配时不要直接LIKE '%南山区%',因为「南山区」在多个城市可能存在重名,必须结合上级代码缩小范围。

import pandas as pd df = pd.read_csv('administrative_division.csv', encoding='utf-8-sig', dtype={'code': str}) def match_district(raw_address, city_code_prefix=None): """按名称模糊匹配县级单位,可选按市级代码前缀限定范围""" candidates = df[df['level'] == '县级'] if city_code_prefix: candidates = candidates[candidates['code'].str.startswith(city_code_prefix)] # 去掉常见后缀再匹配,减少「区」「县」差异带来的漏配 key = raw_address.replace('区', '').replace('县', '').replace('市', '') hit = candidates[candidates['name'].str.contains(key, na=False)] return hit[['code', 'name']].values.tolist() print(match_district('南山区', city_code_prefix='4403'))

city_code_prefix这个参数是防重名的关键。不加限定,「南山区」可能同时命中深圳、鹤岗等地的同名区。replace去后缀是常见做法,但要注意别把「市辖区」这类特殊名称误伤,实际项目里我会先跑一遍全量匹配,把歧义结果人工确认后再固化规则。

3.3 增量更新:行政区划变更时怎么不打乱已有数据

行政区划不是一成不变的,撤县设区、合并、更名每年都有。直接全量替换风险很大,因为你的业务表里可能已经存了旧代码。常见做法是加一个is_active或updated_at字段做软更新。

-- 加字段标记有效性,而不是物理删除 ALTER TABLE administrative_division ADD COLUMN is_active TINYINT DEFAULT 1; ALTER TABLE administrative_division ADD COLUMN updated_at DATE; -- 新版本导入到临时表后,对比差异再更新 CREATE TABLE administrative_division_new LIKE administrative_division; -- (导入新数据到 _new 表) -- 找出新增的代码 SELECT code, name FROM administrative_division_new WHERE code NOT IN (SELECT code FROM administrative_division); -- 找出已失效的代码(旧表有、新表没有) SELECT code, name FROM administrative_division WHERE code NOT IN (SELECT code FROM administrative_division_new);

先对比再更新,别直接TRUNCATE重导。业务表里引用了旧代码的外键一旦断裂,排查起来非常痛苦。is_active标记法让历史数据还能查到,只是不再参与新业务匹配。

4. 避坑与排查:这份数据集用起来最容易栽的五个地方

这一章是我自己踩过的坑,按「现象 → 原因 → 解决」写,你对着排查能省不少时间。

4.1 导入后条数不是 3050

现象:SELECT COUNT(*)出来只有 2900 多条。原因通常是 CSV 里有字段包含逗号(比如名称里带逗号),被错误分隔,或者文件末尾有空行被跳过。解决:用LOAD DATA时检查FIELDS TERMINATED BY是否和实际一致,导入前用wc -l看行数,CSV 行数应该等于记录数加表头。

4.2 代码前导零丢失

现象:110000变成了110000看着没事,但某些代码在 Excel 里被显示成科学计数法或丢了前导零。原因:Excel 和 pandas 默认把纯数字列推断为数值型。解决:CSV 导入时强制dtype={'code': str},Excel 里先把列格式设成文本再打开。

4.3 名称匹配到多个结果

现象:搜「朝阳区」出来北京朝阳和长春朝阳两条。原因:行政区划重名是客观存在的,不是数据错误。解决:匹配时必须带上城市代码前缀,或者让用户在候选列表里选,别自动取第一条。

4.4 字符集乱码

现象:导入后地名显示成问号或方块。原因:源文件是 GBK,数据库是 utf8mb4,中间没做转换。解决:导入前用iconv -f GBK -t UTF-8转一遍,或者建表时明确CHARSET=utf8mb4,导入命令里加CHARACTER SET utf8mb4。

4.5 拿旧数据做新业务

现象:业务上线后发现某些区已经撤并,但代码表里还是旧的。原因:这份数据来源于网络收集整理,更新滞后是常态。解决:把它当基线,上线前用官方发布的最新代码做一次差异比对,重点核对近两年有变更的省份。

提示:这份数据集明确说明可能存在误差,任何涉及合规、统计上报的场景,都要以权威来源二次校验,别直接拿它当唯一依据。

5. 进阶用法:用代码表做地址标准化流水线

前面讲的都是单点操作,实际项目里我会把这份代码表串成一条地址标准化流水线:原始地址 → 分词提取省市区关键词 → 按代码前缀逐级匹配 → 输出标准六位代码和规范名称。核心技巧是「逐级收敛」——先匹配省级,锁定范围后再匹配市级,最后匹配县级,每一步都用代码前缀缩小候选集,比一次性模糊匹配准确率高得多。

import pandas as pd df = pd.read_csv('administrative_division.csv', encoding='utf-8-sig', dtype={'code': str}) def normalize_address(raw): """逐级收敛的地址标准化:省 -> 市 -> 县""" result = {'province': None, 'city': None, 'district': None} # 省级:按名称包含匹配 provinces = df[df['level'] == '省级'] for _, row in provinces.iterrows(): key = row['name'].replace('省', '').replace('市', '').replace('自治区', '') if key and key in raw: result['province'] = row['code'] break if not result['province']: return result # 市级:限定在省级代码前两位内 cities = df[(df['level'] == '市级') & (df['code'].str.startswith(result['province'][:2]))] for _, row in cities.iterrows(): key = row['name'].replace('市', '').replace('地区', '').replace('自治州', '') if key and key in raw: result['city'] = row['code'] break if not result['city']: return result # 县级:限定在市级代码前四位内 districts = df[(df['level'] == '县级') & (df['code'].str.startswith(result['city'][:4]))] for _, row in districts.iterrows(): key = row['name'].replace('区', '').replace('县', '').replace('市', '') if key and key in raw: result['district'] = row['code'] break return result print(normalize_address('广东省深圳市南山区科技园')) # {'province': '440000', 'city': '440300', 'district': '440305'}

这段代码的关键在startswith(result['province'][:2])和startswith(result['city'][:4]),它把每一级的候选集从 3050 条压缩到几十条,既快又准。replace链是为了抹平「省」「市」「自治区」「地区」「自治州」这些后缀差异,但要注意「内蒙古自治区」这种名称,去掉「自治区」后剩「内蒙古」,匹配时用户输入里通常也有「内蒙古」,所以能命中。验证方法很简单:拿一批真实用户地址跑一遍,统计province、city、district三级都命中的比例,低于 80% 就说明你的后缀处理或关键词提取需要调。

从那以后我每次接地址相关的需求,都会先把这份代码表导进一个临时库,跑一遍全量匹配率再动手写业务逻辑,而不是上来就写正则。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询