☰
手机号码归属地数据库:36万条号段记录的结构、查询与更新指南
2026/10/14 7:40:59 网站建设 项目流程

简介:全国手机号码段归属地数据库是一份面向开发者和数据分析人员的实用数据资源,覆盖360569条手机号码段记录,可快速查询号码所属运营商、省份、城市、区号及邮编等关键信息,适用于反欺诈风控、地域化营销、客户服务和通信消费分析等场景。压缩包共4个文件,包含1个SQL脚本、1个CSV文件和2个说明文本,整体仅7.48MB;SQL脚本提供建表与导入语句,适合直接写入MySQL等关系型数据库,CSV/TXT数据表可导入Excel进行排序、过滤和快速查看。资源包已获得5054人学习下载,内容组织清晰,既支持程序化查询接口开发,也兼顾非技术人员的表格化浏览需求。凭借完整的号码段字段体系和多格式交付,这份数据能帮助使用者快速搭建本地号码归属地查询能力,为业务系统提供地域判断和号码分析基础。

1. 手机号码归属地数据库:这 36 万条记录到底能解决什么

做短信触达、App 用户画像、电商订单收货地预判的人,都绕不开一个基础设施:全国手机号码段归属地数据库。它把全国已分配的手机号段收进一张二维表,360569 条记录对应 36 万多个号段,每一行标明这个号段属于哪个省、哪个市、哪家运营商。它不是实时接口,而是一份能离线校验、离线检索的静态数据。

这类数据最大的价值不在数据量,而在覆盖率和结构化程度。十万条记录只能覆盖常用号段,36 万条这个量级基本把已分配号段都收进来了。你拿着它可以做三件事:给任意手机号算归属地、按省份城市统计用户分布、在业务表单里预填充地区信息。适合后端开发、数据分析、运营和短信服务从业者。下面把这套数据从结构到使用、再到踩坑点,完整过一遍。

2. 号段库为什么是 36 万条:号码结构与数据组织的底层逻辑

2.1 11 位手机号码的组成与号段分配规则

一个 11 位手机号码不是随机数字。前 3 位是网络识别号,标识运营商和号段大类;第 4 到第 7 位负责标识号码所属的地区,业内叫地区编码;最后 4 位是用户号。也就是说,手机号码的前 7 位基本决定了它的归属地和运营商。做归属地查询时,本质上是拿手机号的前 7 位去号段表里做一次精确匹配。

号码部分位数作用
前 3 位3网络识别号,标识运营商和号段大类
第 4-7 位4地区编码,定位到省份和城市
第 8-11 位4用户号,不参与归属地判断

举例来说,一个手机号前 7 位是 1380013,号段表里记录“1380013 属于某省某市运营商甲”,那么整条号码的归属地也就确定了。号段资源由基础运营商向通信管理部门申请,每次申请下来的是一段连续号码,一般对应一万个连续号码。所以号段表的行数就是全国所有已分配号段的总和,这也是 36 万条记录这个数字的来源——不是随意标注,而是号段管理粒度决定的。

这里有一个值得注意的点:号段分配规则决定了数据表形态是“一行一个号段”,而不是“一行一个手机号”。如果做成手机号级数据库,全国十几亿个号码根本存不下,也没必要。按号段存储,36 万行就能代表全国已分配号码的归属分布,这是典型的用前缀索引缩小数据量的思路。

2.2 每条记录设计哪些字段:从实用角度倒推字段清单

拿到一份号段库,先别急着导入,先看表头。我用过几份不同的号段库,字段设计大同小异,但核心字段就那么几个。按实际使用频率排一下:

字段名作用是否必备
号段/前缀用于和手机号前 7 位匹配必备
省份一级地域信息必备
城市二级地域信息必备
运营商判断号码所属运营商常见
区号配合做固话和地区识别可选
邮编补充地域编码可选
卡类型运营商内部套餐类型,现在不太准可选

日常使用我只看前四个字段。区号和邮编在需要和地址库联动的场景会用到,但不是刚需。卡类型这个字段随着运营商套餐体系改革已经严重失真,不建议作为业务判断依据。

字段类型选择上,号段前缀字段建议存成字符串而不是整数,避免开头的 0 被吞掉,匹配时用字符串比较也更直观。省份、城市字段用 VARCHAR,运营商字段可以存中文,省去联表成本。36 万行的量级不会造成存储压力,优先考虑查询方便。

2.3 36 万这个数字是怎么来的:一个号段对应一行

为什么是 360569 而不是 360000?因为号码段资源是动态分配的。运营商每年还会启用新号段,比如 19 开头的多个新号段就是后来分配的。所以一份号段库的行数是这个时间点下全国已分配号段的快照。越接近当前日期的号段库,行数越接近真实的已分配号段数量,也会比旧版本多一些新号段行。

另一个造成行数变化的因素:虚拟运营商和物联网卡。虚拟运营商号段(如 170、171、162、165、167 等)和物联网卡号段(如 1440、1410 等)也独立编号,会被计入总行数。如果你的业务不涉及物联网卡,可以过滤掉这些前缀;如果做短信通道风控,这些号段恰恰是关键区域。

从使用角度,不用纠结 360569 和 360600 的差异,那个位数误差没有业务意义。真正要关心的是两点:覆盖时间(号段数据截止到哪个月)和字段质量(有没有大量空值)。字段质量检查方法在第 4 章会专门讲。

3. 把 Excel 里的 36 万条记录用起来:匹配公式与统计步骤

3.1 打开大文件:编码和格式的前 5 分钟

36 万条记录的 Excel 文件,常规大小在十兆到几十兆之间,Excel 打开没问题,但前提是格式正确。我遇到过两种典型问题:文件本身以 CSV 保存,用 Excel 直接打开中文乱码;手机号字段被 Excel 自动转成科学计数法。

先说乱码。CSV 文件常见编码是 UTF-8 和 GBK。Excel 打开 UTF-8 编码的 CSV 时,如果系统区域设置是中文,通常能正常显示;但有些 CSV 没加 UTF-8 BOM,Excel 会按本地编码解析,中文就乱码了。处理方法是不要双击文件,而是在 Excel 里点“数据”选项卡的“从文本/CSV”导入,导入对话框能指定编码,UTF-8 选了不对就换 GBK,预览窗口能看到中文是否正常。

再说科学计数法。Excel 默认把超过 11 位的数字显示成科学计数法,手机号 11 位恰好踩在边缘。所以无论是号码列还是号段列,导入后马上把这两列的单元格格式设为“文本”。如果已经显示成科学计数法,用“设置单元格格式 - 自定义 - 0”可以把显示恢复成数字,但只能修复显示;如果原始数据已被 Excel 转成浮点数导致精度损失,那数据本身已经坏了,只能重新导入。最稳妥的办法是导入时就把列格式指定为文本。

提示:拿到文件先复制一份备份,所有排查都在副本上进行,别在原始文件上反复操作。这一步能避免不少后续后悔。

3.2 用 VLOOKUP 把手机号匹配到对应号段记录

号段表最常用的需求是:手头有一份手机号清单,要给每个号码补上归属地。Excel 里最直接的方式是 VLOOKUP。

先把号段表整理成标准结构:A 列是号段前缀,B 列是省份,C 列是城市,D 列是运营商。然后在手机号清单表里,第一步先提取手机号前 7 位。假设手机号在 A2,B2 输入公式:

=LEFT(A2, 7)

这个公式从 11 位手机号左侧截取 7 位,得到号段前缀。为什么是 7 位?前面讲过,前 7 位决定归属地。注意手机号必须是文本格式,如果是数字格式,LEFT 会先把数字转文本再截取,一般没问题;但若手机号列有科学计数法残留,截取结果会错。

第二步做匹配。C2 输入:

=VLOOKUP(B2, 号段表!$A$2:$D$360570, 2, FALSE)

逻辑是用 B2 的 7 位前缀到号段表 A 列精确查找,找到后返回该行第 2 列,也就是省份。四个参数逐个解释:

  • B2:查找值,手机号前 7 位。
  • 号段表!$A$2:$D$360570:查找区域。第一列必须是前缀列,VLOOKUP 永远在区域第一列找人。
  • 2:返回第 2 列即省份。要城市改成 3,要运营商改成 4。
  • FALSE:精确匹配。必须写 FALSE,否则 VLOOKUP 按模糊匹配走,结果完全不可控。

下拉填充后,如果清单有几万行,Excel 会卡几秒到几十秒,这是正常的。超过一分钟的话,把查找区域缩小,比如先匹配前 10 万条数据。

3.3 用透视表快速统计省份分布

匹配好归属地之后,运营常要一张省份分布表。透视表是最快的手段。

操作步骤:选中手机号清单里包含省份、城市、运算符的整块数据,点“插入 - 数据透视表”,把“省份”字段拖到行区域,把“手机号”字段拖到值区域。值字段默认是计数,正好是每个省份的用户数。再把“运营商”字段拖到列区域,就能得到省份乘运营商的矩阵,一眼看出每个省份里不同运营商的比例。

透视表做完有两件事要检查。第一,值区域如果显示的不是计数而是求和,右键点值字段选“值字段设置”,改成“计数”。第二,如果存在大量匹配不到归属地或者显示为空的行,说明清单里混有虚拟号段、物联网卡号段或很新的号段,号段表还没覆盖。这时候先看占比,低于 1% 可以不处理;高于 5% 就需要更新号段表。

4. 数据准确性验证:号段库更新与抽样的实操方法

4.1 抽样验证的两种靠谱对照源

拿到一份号段库,不能直接信。准确率怎么验?我一般抽 50 到 100 个号码,覆盖不同号段前缀,逐个验证。对照源选两种:

一是运营商官方渠道,比如运营商自带的话费查询页面显示的归属地信息。这是运营商自己的数据,最准确,缺点是只能验证自己名下的号码。二是电商结算页和快递下单页。很多电商和物流平台在填手机号时会展示归属地,用于风控或地址联想。实际对比下来,主流平台的归属地准确率相当高,而且输入陌生号码也能验证。

抽样时要跨号段、跨地区,不要只抽同一批前缀。比如从号段表里随机挑 15 个不同前缀,每个前缀验证 1 到 2 个号码,这样能覆盖不同地区和运营商。如果 100 个里错误不超过 3 个,准确率在 97% 以上,可以放心用于归属地展示业务。做批量验证时,记录前 7 位和对照结果,不用保留完整手机号,这也是数据最小化的习惯。

4.2 携号转网和虚拟号段带来的两类偏差

号段库最容易被吐槽的是携号转网和虚拟号段。

携号转网:手机号前缀归属的运营商没有变,但用户已经转到另一家运营商。号段库从放号角度记录的是“这个号段最初属于某运营商”,用它判断用户的当前运营商,就会误判。这不是数据库做错了,而是静态号段和动态运营商属性存在天然时间差。做短信通道或语音线路选择时,建议额外的实时校验渠道来补充,号段库只作为兜底。

虚拟号段:170、171、162、165、167 等号段由虚拟运营商使用,归属地规则与基础运营商不同。虚拟运营商没有自己的地区网络,号码归属地按合作的基础运营商来定,有些虚拟号段甚至只能精确到省级,城市字段为空是正常现象。业务上需要区分普通手机号与虚拟号段时,按前缀过滤更可靠,而不是依赖城市字段。

4.3 增量更新:号段库多久需要维护一次

号段库不是买一次用一辈子。通信管理部门不定期发放新号段,运营商也会启用新号段资源。常见的 19 开头的号段放量节点每年都有。如果你手里的号段表是两三年前的,遇到新号段手机号就会匹配不上,表现是 VLOOKUP 大量返回错误值。

更新方式分两种:一是定期找新版本号段库替换,半年到一年一次,适合号段变化不频繁的业务;二是做增量维护,在现有表里追加新号段记录,适合对准确率敏感、不想全量替换的场景。

增量维护的操作不难。把匹配不到的手机号清单单独拉出来,统计前 7 位前缀,如果一批手机号共享某几个前缀,说明这几个前缀很可能是新号段。去运营商的公开公告或可信任的渠道核实归属地,然后手工补进号段表。我习惯把补充记录和核实日期写在备注列,避免下次全量更新时产生冲突。

5. 避坑指南:使用 36 万条号码段数据时容易翻车的 4 个细节

5.1 Excel 打开乱码,数据表内容错位

现象:文件双击打开后中文全是乱码,或者数据挤在一格里,列对不上。

原因:文件实际是 CSV 编码,Excel 直接打开时没有正确识别 UTF-8 或 GBK;另一个常见原因是 CSV 中某个字段含有逗号或换行符,导致后续内容错位到下一列。

解决:不要双击,用“数据 - 从文本/CSV”导入,导入时选对编码。列错位时在导入预览界面检查分列符是不是逗号。如果是真正的 xlsx 文件仍然乱码,大概率文件已损坏,直接重新获取原始文件,不要花时间尝试修复。

5.2 VLOOKUP 匹配不到导致大量错误值

现象:部分手机号能匹配到归属地,大部分返回错误值,或者同一个前缀有的能匹配有的不能。

原因:第一,号段表的前缀列存的是数字,手机号前 7 位是文本,VLOOKUP 对数据类型敏感,两边格式不一致就匹配不上。第二,手机号列被 Excel 转成科学计数法,截取时已经出错。第三,号段表里有隐藏空格或全角字符。

解决:先把号段表前缀列和手机号前缀列都设为文本格式,再用 TRIM 去掉首尾空格。如果还不行,把查找值和查找区域统一成同一种类型,写法如下:

=VLOOKUP(TEXT(B2, "0"), 号段表!$A:$D, 2, FALSE)

TEXT(B2, "0") 把 B2 强制转成不带小数点的文本数字,和号段表 A 列文本格式对齐。两边做同样处理,匹配率立刻上来。排查时可以先用条件格式给错误值标色,观察是全部前缀错还是个别前缀错,缩小范围。

5.3 直辖市和省直辖县归属地显示不精确

现象:直辖市号码的城市字段显示的是直辖市本身,在做省市级联统计时和普通省份的城市概念混在一起,汇总逻辑出错。省直辖县级市的号码匹配到的城市名是县级市,在省级报表里看起来不像标准城市。

原因:这些地区在行政区划上本来就是直辖市或直管县,号段库如实记录没有错,是统计维度没适配。

解决:省份维度统计时把直辖市单独归类,城市字段统一处理成“直辖市”;处理省直辖县级市时,按需求决定显示为上一级地级市还是保留原值。我习惯额外加一列“统计城市”,用公式判断城市字段,再归一化。这一步不复杂,但在生成报表时能省很多解释成本。

5.4 运营商字段与实际发卡运营商不一致

现象:号码前 7 位在号段库中归属运营商甲,用户实际用的是运营商乙的号卡,两个字段对不上。

原因:两类情况。一是携号转网,用户带着号码更换了运营商,号段记录不会跟随变化;二是号段重耕,运营商之间对部分号码资源做了重新分配。静态号段库必然滞后于这些动态调整,这是行业普遍情况。

解决:先看使用场景再决定要不要较真。短信通道或线路选择等强依赖运营商属性的场景,必须叠加实时查询能力,不能只靠静态号段库。仅做用户画像和归属地展示时,按静态结果标注,并加上“可能不准”的内部标记。最忌讳的是把号段库当成唯一真值来源,用在计费或通道选择上,那必然要踩坑。

6. 进阶用法:把 36 万条号段数据导入 MySQL,查询进入毫秒级

Excel 处理数万行匹配已经吃力,当业务每天有十几万次查询时,把号段表放进关系型数据库是必然选择。MySQL 方案重点看三件事:建表、索引、查询写法。

6.1 建表语句与索引设计

CREATE TABLE phone_segment ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, prefix CHAR(7) NOT NULL COMMENT '号段前缀,手机号前7位', province VARCHAR(30) NOT NULL COMMENT '省份', city VARCHAR(30) NOT NULL COMMENT '城市', carrier VARCHAR(20) DEFAULT NULL COMMENT '运营商', area_code VARCHAR(10) DEFAULT NULL COMMENT '区号', UNIQUE KEY uk_prefix (prefix) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

prefix 用 CHAR(7) 存固定长度前缀,比 VARCHAR 更省空间,也避免字符串比较时的隐式转换。UNIQUE 索引让按前缀的等值查询走索引覆盖,单次查询毫秒级。导入方式用 LOAD DATA 或分批次 INSERT,36 万行全量导入在一分钟左右;导入之前把源数据里的空城市字段统一处理成默认值,避免后续统计出现空行。

6.2 三个查询场景的 SQL 示例

查单个号码归属地:

SELECT province, city, carrier FROM phone_segment WHERE prefix = LEFT('13812345678', 7);

LEFT 直接在查询里截取手机号前 7 位,省掉一层应用代码。批量匹配一批号码时用 JOIN:

SELECT u.phone, s.province, s.city FROM user_phones u LEFT JOIN phone_segment s ON s.prefix = LEFT(u.phone, 7);

LEFT JOIN 保证匹配不到的号码保留为空,后续单独排查。按省份统计用户量:

SELECT province, COUNT(*) AS cnt FROM phone_segment GROUP BY province ORDER BY cnt DESC;

三个查询都命中 uk_prefix 索引。导入完成后务必做一次总行数校验:

SELECT COUNT(*) FROM phone_segment;

这个数字要和 Excel 源表的行数完全一致,避免导入丢行。我的习惯是再抽查 5 个号段前缀,分别用 Excel 和 SQL 查一次,两边的省份和城市一致才算导入成功。数据进入数据库之后,Excel 就只负责临时分析,日常查询全部走 SQL。36 万条数据的量级在 MySQL 里只是普通小表,毫秒级查询没有任何压力,这个迁移值得早做。希望帮到你。

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

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

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

立即咨询