跳到主内容
金融工具 6 分钟阅读

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 位一组排版,方便对着对账单逐段核对,空格本身不属于账号,任何计算前都会被丢掉。

以德国 IBAN「DE89 3704 0044 0532 0130 00」为例
组成部分位置示例含义
国家代码第 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 的切分方式也各不相同。

常见国家的 IBAN 长度与 BBAN 结构
国家长度BBAN 结构
德国 DE228 位银行代码(Bankleitzahl)+ 10 位账号
英国 GB224 位字母银行代码 + 6 位分行代码(sort code)+ 8 位账号
法国 FR275 位银行 + 5 位分行 + 11 位账号 + 2 位本国校验位
意大利 IT271 位字母(CIN)+ 5 位银行(ABI)+ 5 位分行(CAB)+ 12 位账号
西班牙 ES244 位银行 + 4 位分行 + 2 位本国校验位 + 10 位账号
荷兰 NL184 位字母银行代码 + 10 位账号
挪威 NO154 位银行代码 + 6 位账号 + 1 位本国校验位

既然分段规则由各国自定,解析器就必须维护一张「第几位到第几位是什么」的对照表。本站工具正是按这样一张表切出银行代码、分行代码和账号,只有表里定义了分行段的国家才会填出分行字段。而在有分行概念的国家,BBAN 末尾往往还留了本国校验位,所以工具显示的账号位数会比 BBAN 短。

长度不符会直接判错,根本轮不到校验位出场:IBAN 的长度由所属国家唯一确定,一串以 DE 开头却只有 21 位的字符不可能是有效的德国 IBAN。

校验位:ISO 7064 MOD-97-10 的五个步骤

校验位不是随机数,也不是银行分配的,它就是算出来的。ISO 13616 指定采用 ISO 7064 MOD-97-10 这套模 97 方案。

  1. 去掉空格和连字符,把整串字符转成大写。
  2. 把最前面的四个字符(国家代码加两位校验位)整体挪到末尾。
  3. 每个字母按字母表顺序换成两位数字:A 换成 10、B 换成 11,一直到 Z 换成 35。
  4. 把换完的结果当成一个很长的整数。
  5. 对它取模 97,只看余数。有效 IBAN 的余数必须正好是 1。

第 4 步是手算最别扭的地方:德国 IBAN 展开后是 24 位数字,更长的国家会超过 34 位,普通计算器装不下。办法是分段降模——每次取大约 9 位数字,用已有余数乘以 10 的对应次方,加上这一段,再整体对 97 取余。程序员面对的是同一个问题,所以代码里必须用大整数类型,而不是普通整型。

为什么模数选 97

97 是质数,又比任何一个十进制数字都大,这两点决定了它的检错能力。改动转换后数字串里的任意一位,数值的变化量等于新旧数字之差乘以 10 的若干次方;交换相邻两个不同的数字,变化量是两数之差乘以 9 再乘以 10 的若干次方。因为 97 是质数,这两个因子都消不掉,所以这两类错误一定会被余数暴露。

余数等于 0 并不是某种特殊含义的额外错误码。它和 2、96 一样,只说明这串字符无效。

手算一遍:每一步数字都可复算

拿挪威的「NO93 8601 1117 947」举例,一共 15 位,纸笔就能算完。下面每个中间结果都实际验算过,可以照着核对。

  1. 拆开:国家代码 NO、校验位 93、BBAN 为 86011117947。
  2. 把前四位挪到末尾,得到 86011117947NO93。
  3. 换字母:N 换成 23、O 换成 24,于是数字变成 86011117947232493,共 17 位。
  4. 分段降模:860111179 mod 97 = 54,再用 (54 × 100000000 + 47232493) mod 97 计算,结果是 1。
  5. 余数等于 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 查询需要发请求,而这个请求不包含账号部分。

本文相关工具

更多指南