Base62 编码完全指南:把大数字 ID 压成短链字符串
讲清楚 Base62 编码怎么用 0-9a-zA-Z 这 62 个字符,把数据库自增 ID 压成短链字符串,以及它和 Base64 在 URL 安全和长度上的真实差别。
Base62 编码完全指南:把大数字 ID 压成短链字符串
每次看到 bit.ly 给的 /3dPq9Zx,或者 YouTube 视频地址里那串看不出规律的字符,背后多半都是同一套手法:Base62 编码。它用 62 个最普通的字符,把一个又长又丑的数字 ID 压成短短几位,放进 URL 里还不会断。这篇把它讲透:62 个字符是哪些,为什么是这套,怎么把数字变短串,以及它和大家更熟的 Base64 到底差在哪。
Base62 用的是哪 62 个字符
Base62 的字母表非常好记,就是数字加大小写字母:0-9 共 10 个,大写 A-Z 共 26 个,小写 a-z 共 26 个,加起来正好 62 个。本工具用的是通行顺序:先 0-9,再 A-Z,再 a-z,所以「A」代表 10,「a」代表 36,「z」代表 61。
关键在于这 62 个字符里,没有任何一个是 URL 里需要特别处理的特殊符号。它不含 +、/、=、空格、?、#、&,也不含中文标点。这意味着一段 Base62 字符串可以原样放进 URL 路径,任何浏览器、任何后端的 URL 解析器都会把它当成普通路径段,不需要百分号转义,不需要填充补位。链接被聊天软件转来转去、被复制粘贴,它都不会断。
为什么短链和短 ID 偏爱 Base62
一条短链做的事很简单:把一个很短的公开 key 映射到数据库里存着的长目标地址。数据库这个 key,通常就是一个自增整数,1、2、3 一直往上加。问题是把这个整数直接放进 URL 太浪费:十进制只有 10 个字符位,数字一大,串就很长。
换成 Base62,每一位有 62 种取值,信息密度高得多。7 位 Base62 串能覆盖 62 的 7 次方,大约 3.5 万亿条链接。也就是说,只用七个字符,就够一个相当大的产品发好几年的短链了。而且递增 ID 编出来很优雅:早期 ID 小,编出来的串很短,之后每次只长一个字符,增长非常平缓。
还有一个被低估的好处:把自增主键编成 Base62 再暴露,能盖住「你有多少行数据」这个信息。直接放 /article/4815162342,别人一眼就知道你大概有几十亿行;编成短码后,这个规模就不那么直白了。
把一个数字编成 Base62:以 125 为例
理解 Base62 最快的办法是手算一个小数字。Base62 本质就是 62 进制,进位规则和十进制一样,只是逢 62 进一,而不是逢 10 进一。
拿数值 125 来说:125 = 2 × 62 + 1。所以高位是 2,低位是 1,拼起来就是「21」。反过来解码也一样:「21」就是 2 × 62 + 1 = 125。再举几个边界值帮你建立直觉:值 0 编码成「0」,值 61 编码成「z」(单个字符能表示的最大值),值 62 进位成「10」,正好对应十进制里 9 进到 10。
| 十进制 | Base62 | |--------|--------| | 0 | 0 | | 61 | z | | 62 | 10 | | 125 | 21 |
我自己第一次给项目做短链时,卡在一个看似简单的地方:64 位的 ID 用普通整数运算会在 2 的 53 次方处丢精度。后来改成 BigInt 大整数运算才彻底解决,一个 9876543210 这样的大值才能精确往返,编出去再解回来一字不差。所以这个工具底层全程用 BigInt,数字再大也不会溢出。你可以直接打开 Base62 编码解码器,把上面这些值粘进去验证一遍。
Base62 和 Base64 到底差在哪
这是大家最容易搞混的一对。两者都把字节压成可打印字符,但目标不一样。
Base64 用 64 个符号,是干净的 6 比特打包,效率高。但它的字母表里含「+」「/」和填充用的「=」,这三个字符在 URL 路径里都不安全:+ 可能被当成空格,/ 是路径分隔符,= 是查询参数赋值号。所以一段 Base64 串想放进 URL,通常得先做一次百分号转义,变成 %2B、%2F 这种,既难看又容易出错。
Base62 正好去掉了这三个惹麻烦的字符,只留 0-9A-Za-z。代价是编码方式变了:不再是整齐的 6 比特切分,而是需要 BigInt 除法,所以同一个值的 Base62 输出会比 Base64 长几个百分点。但对短链来说,几个百分点的长度换来彻底的 URL 安全,这笔账非常划算。
一句话记忆:要塞进 URL 又不想转义,用 Base62;要在数据传输或存储里高效打包、不在乎 URL 安全,用 Base64 编码解码器。顺带提一句,千万别把 Base64 串直接丢进 Base62 解码器,里面的 +、/、= 不在 Base62 字母表里,会直接被拒。
一个容易踩的坑:这不是加密
最后强调一条,免得有人误用:Base62 是可逆编码,不是加密。任何人拿到 Base62 串都能解回原始数字或文本,它的价值在于压缩和 URL 安全,绝不能用来保护密码、会话密钥或任何私密内容。要藏秘密,请走真正的加密手段,而不是指望别人看不懂这串字符。
同样要留意字母表顺序。本工具用通行的先 0-9 再 A-Z 再 a-z 顺序,但有些库把小写排在大写前面,同一个数字就会编出不同结果。两个系统对不上时,先核对字母表顺序,再怀疑是 bug。
Made by Toolora · Updated 2026-06-13