
简介全国行政区划代码表数据库面向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) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_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, encodingutf-8-sig, dtype{code: str}) print(df.shape) # 期望 (3050, 3) print(df[level].value_counts()) # 看各级别分布是否合理 # JSON 解析注意可能是数组或按层级嵌套 import json with open(administrative_division.json, r, encodingutf-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, encodingutf-8-sig, dtype{code: str}) def match_district(raw_address, city_code_prefixNone): 按名称模糊匹配县级单位可选按市级代码前缀限定范围 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, naFalse)] return hit[[code, name]].values.tolist() print(match_district(南山区, city_code_prefix4403))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转一遍或者建表时明确CHARSETutf8mb4导入命令里加CHARACTER SET utf8mb4。4.5 拿旧数据做新业务现象业务上线后发现某些区已经撤并但代码表里还是旧的。原因这份数据来源于网络收集整理更新滞后是常态。解决把它当基线上线前用官方发布的最新代码做一次差异比对重点核对近两年有变更的省份。提示这份数据集明确说明可能存在误差任何涉及合规、统计上报的场景都要以权威来源二次校验别直接拿它当唯一依据。5. 进阶用法用代码表做地址标准化流水线前面讲的都是单点操作实际项目里我会把这份代码表串成一条地址标准化流水线原始地址 → 分词提取省市区关键词 → 按代码前缀逐级匹配 → 输出标准六位代码和规范名称。核心技巧是「逐级收敛」——先匹配省级锁定范围后再匹配市级最后匹配县级每一步都用代码前缀缩小候选集比一次性模糊匹配准确率高得多。import pandas as pd df pd.read_csv(administrative_division.csv, encodingutf-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% 就说明你的后缀处理或关键词提取需要调。从那以后我每次接地址相关的需求都会先把这份代码表导进一个临时库跑一遍全量匹配率再动手写业务逻辑而不是上来就写正则。希望帮到你。本文还有配套的精品资源点击获取