IBAN 结构与校验位:各段含义和 MOD-97 手算过程
逐段拆解 IBAN 的国家代码、校验位与 BBAN 结构,手算一遍 ISO 7064 MOD-97 校验算法,并说明校验通过为什么不等于账号真实存在。
更新于 2026-09-11
IBAN 的结构可以一句话说完:前两位是国家代码,接着两位是校验位,后面全部是该国自定义的账号格式。真正承担防错功能的只有那两个校验位——把国家代码和校验位挪到末尾、字母换成数字之后,整个长数字除以 97 的余数必须正好等于 1。
下面按国家拆开每一段的含义,用可复算的中间数字走一遍 MOD-97 的完整过程,最后说清楚校验通过究竟证明了什么、又没证明什么。
IBAN 的四个组成部分
IBAN 全称 International Bank Account Number(国际银行账号),由 ISO 13616 定义,只用大写字母和数字,最长 34 位。平时看到的空格纯粹是给人眼看的:银行按每 4 位一组排版,方便对着对账单逐段核对,空格本身不属于账号,任何计算前都会被丢掉。
| 组成部分 | 位置 | 示例 | 含义 |
|---|---|---|---|
| 国家代码 | 第 1-2 位 | DE | 定义这套账号格式的注册国家。 |
| 校验位 | 第 3-4 位 | 89 | 根据整串字符算出,算法为 ISO 7064 MOD-97-10。 |
| 银行代码 | 第 5-12 位 | 37040044 | 开户行标识,用各国自己的格式;这里是 8 位 Bankleitzahl(BLZ)。 |
| 账号 | 第 13-22 位 | 0532013000 | 具体账户号码;有些国家会把分行号或本国校验位排在这一段里。 |
只有前 4 位在所有国家含义相同。从第 5 位开始就是 BBAN(Basic Bank Account Number,基本账号),它内部怎么切分完全由各国登记机构规定。
本站校验工具会先去掉空格和连字符、再统一转成大写,所以「de89 3704 0044 0532 0130 00」和「DE89370400440532013000」输入进去完全等价。
BBAN:为什么各国后半段长得完全不一样
抛开前 4 位,两个不同国家的 IBAN 几乎找不到共同点。长度差异就很大:本站国家表里最短的是挪威 15 位,最长的是圣卢西亚 32 位;BBAN 的切分方式也各不相同。
| 国家 | 长度 | BBAN 结构 |
|---|---|---|
| 德国 DE | 22 | 8 位银行代码(Bankleitzahl)+ 10 位账号 |
| 英国 GB | 22 | 4 位字母银行代码 + 6 位分行代码(sort code)+ 8 位账号 |
| 法国 FR | 27 | 5 位银行 + 5 位分行 + 11 位账号 + 2 位本国校验位 |
| 意大利 IT | 27 | 1 位字母(CIN)+ 5 位银行(ABI)+ 5 位分行(CAB)+ 12 位账号 |
| 西班牙 ES | 24 | 4 位银行 + 4 位分行 + 2 位本国校验位 + 10 位账号 |
| 荷兰 NL | 18 | 4 位字母银行代码 + 10 位账号 |
| 挪威 NO | 15 | 4 位银行代码 + 6 位账号 + 1 位本国校验位 |
既然分段规则由各国自定,解析器就必须维护一张「第几位到第几位是什么」的对照表。本站工具正是按这样一张表切出银行代码、分行代码和账号,只有表里定义了分行段的国家才会填出分行字段。而在有分行概念的国家,BBAN 末尾往往还留了本国校验位,所以工具显示的账号位数会比 BBAN 短。
长度不符会直接判错,根本轮不到校验位出场:IBAN 的长度由所属国家唯一确定,一串以 DE 开头却只有 21 位的字符不可能是有效的德国 IBAN。
校验位:ISO 7064 MOD-97-10 的五个步骤
校验位不是随机数,也不是银行分配的,它就是算出来的。ISO 13616 指定采用 ISO 7064 MOD-97-10 这套模 97 方案。
- 去掉空格和连字符,把整串字符转成大写。
- 把最前面的四个字符(国家代码加两位校验位)整体挪到末尾。
- 每个字母按字母表顺序换成两位数字:A 换成 10、B 换成 11,一直到 Z 换成 35。
- 把换完的结果当成一个很长的整数。
- 对它取模 97,只看余数。有效 IBAN 的余数必须正好是 1。
第 4 步是手算最别扭的地方:德国 IBAN 展开后是 24 位数字,更长的国家会超过 34 位,普通计算器装不下。办法是分段降模——每次取大约 9 位数字,用已有余数乘以 10 的对应次方,加上这一段,再整体对 97 取余。程序员面对的是同一个问题,所以代码里必须用大整数类型,而不是普通整型。
为什么模数选 97
97 是质数,又比任何一个十进制数字都大,这两点决定了它的检错能力。改动转换后数字串里的任意一位,数值的变化量等于新旧数字之差乘以 10 的若干次方;交换相邻两个不同的数字,变化量是两数之差乘以 9 再乘以 10 的若干次方。因为 97 是质数,这两个因子都消不掉,所以这两类错误一定会被余数暴露。
余数等于 0 并不是某种特殊含义的额外错误码。它和 2、96 一样,只说明这串字符无效。
手算一遍:每一步数字都可复算
拿挪威的「NO93 8601 1117 947」举例,一共 15 位,纸笔就能算完。下面每个中间结果都实际验算过,可以照着核对。
- 拆开:国家代码 NO、校验位 93、BBAN 为 86011117947。
- 把前四位挪到末尾,得到 86011117947NO93。
- 换字母:N 换成 23、O 换成 24,于是数字变成 86011117947232493,共 17 位。
- 分段降模:860111179 mod 97 = 54,再用 (54 × 100000000 + 47232493) mod 97 计算,结果是 1。
- 余数等于 1,说明校验位 93 与整串字符是自洽的。
更长的 IBAN 走的是同一条路。德国「DE89 3704 0044 0532 0130 00」旋转后得到 370400440532013000DE89,把 D 换成 13、E 换成 14,得到 24 位数字 370400440532013000131489;分段降模依次是 370400440 mod 97 = 23、(23 × 1000000000 + 532013000) mod 97 = 16、(16 × 1000000 + 131489) mod 97 = 1。
那两个校验位最初是怎么来的
把同一套运算反过来做就能生成校验位:在 BBAN 后面接上国家代码和两个 0,字母换成数字,对 97 取余,再用 98 减去余数。挪威 BBAN 86011117947 的余数是 5,98 - 5 = 93,正好就是 NO93 里的 93;同一套算法给德国例子算出 89,给「GB82 WEST 1234 5698 7654 32」算出 82。
这一整套运算既不需要联网,也不需要银行数据库:本站的 IBAN 校验工具就在浏览器里完成模 97 计算。唯一会发出请求的是可选的银行名称与 BIC 查询,而那个请求里只有国家代码和银行代码,不含账号部分。
校验通过证明了什么,没证明什么
校验位是排错工具,不是开户证明。这两件事之间的落差正是转账出错的常见来源——很多人把「IBAN 有效」直接理解成「账号真实存在,而且属于我要付款的那个人」。
- 它能证明:国家代码在支持范围内,长度正好等于该国规定值,字符只有大写字母和数字,校验位与其余字符相互匹配。
- 它通常能抓到:某一位数字写错、某一个字母写错、多一位或少一位,以及几乎所有的相邻两位互换。
- 它无法证明:账户是否仍然开立、是否真的被发放过、持有人是不是你以为的那个人、银行代码是否属于你抄下的那家机构,以及付款能不能正常入账。
- 银行查询能补充的是:该银行代码在国家登记库里被分配给了某家机构。它对具体某个账户一无所知。
已销户的账号通常仍保留完全合法的 IBAN,因为校验位只和字符有关,与账户状态无关;从旧发票上抄来的 IBAN 也可能结构完全合法,只是银行早已被并购或改名。
把校验通过当作付款核对的第一步,而不是最后一步。核对收款人姓名、和对方确认金额与用途,这些步骤任何 IBAN 校验器都替你做不了。
最常见的输入错误
校验失败的原因绝大多数都很普通,按出现频率大致是这几类。
- 复制粘贴带进来的空格、连字符和换行。这些在本站工具里都无害:开始处理前会先删掉,并统一转成大写。
- 中文或日文输入法打出的全角字符。全角写法的 DE89 和 ASCII 的 DE89 不是同一串字符:它们不属于 A-Z 和 0-9,所以字符检查会失败,工具报的是「包含非法字符」而不是校验失败。把输入法切回半角重新粘贴即可。
- 把 BIC 或 SWIFT 代码填进 IBAN 框。像 DEUTDEFF 这样的 BIC 是 8 位或 11 位,标识一家银行;IBAN 标识的是某家银行下的某个账户,谁也推不出谁。
- 把本国账号当成 IBAN 粘进来。它会立刻卡在长度检查上,因为 IBAN 更长,而且以国家代码开头。
- 粘贴时被截断,通常是最后一位丢了。长度一变,国家长度检查先失败,校验位的运算根本不会开始。
- 重新录入时把两位数字写反。把德国银行代码里的两位数字对调,「DE89 3704 0044 0532 0130 00」的余数会从 1 变成 28;把校验位本身改动一位,「DE88 3704 0044 0532 0130 00」的余数是 0。
报错信息本身就说明卡在了哪一步:「应为 22 位,实际 21 位」说明粘贴短了;「MOD-97 校验失败」说明字符本身就是错的。
IBAN 就是一串定长字符:国家代码、两位校验位,加上各国自定义的账号格式,而对 97 取余的结果直接告诉你这串字符是否自洽。需要验证某个号码时,可以用本站的 IBAN 校验工具,模 97 计算在浏览器本地完成,需要的话再查一下银行代码对应的名称与 BIC。
常见问题
IBAN 校验通过,是不是说明这个账号真实存在?
不是。校验位只能说明字符之间自洽、长度和国家代码在支持范围内。账户是否仍然开立只有开户行知道,所以汇款前仍要和收款方核对户名与账号信息。
IBAN 最长能有多少位?
ISO 13616 规定最长 34 位,每个国家只用一种固定长度。本站国家表里最短是挪威 15 位,最长是圣卢西亚 32 位;荷兰 18 位,德国、英国、瑞士都在 20 位出头。
IBAN 和 BIC(SWIFT 代码)是一回事吗?
不是。BIC 也叫 SWIFT 代码,8 位或 11 位,标识一家银行或其某个分行;IBAN 标识某个具体账户,自带国家代码和两位校验位。跨境汇款通常两者都要填。
银行为什么把 IBAN 按每 4 位一组印出来?
纯粹为了给人看。四位一组便于和纸质对账单逐段比对,也便于在电话里念;分组在任何计算开始前就被丢掉了,对校验位没有影响。
不联网能校验 IBAN 吗?
能。模 97 运算是确定性的,页面加载完成后整个校验都在浏览器里完成,不需要网络。只有可选的银行名称与 BIC 查询需要发请求,而这个请求不包含账号部分。