跳到内容

MB 和 MiB 是不同的!文件大小单位的陷阱

分类:基础知识

当你看到说「文件大小限制为10MB」的规范时,你如何理解?实际上,「MB」和「MiB」是明确不同的单位,混淆它们会导致边界值测试失败和生产故障。本文解释了文件大小单位的精确定义和开发中常见的陷阱。

MB 和 MiB 的定义

表示文件大小的单位有两种:SI 单位制(十进制)和 IEC 单位制(二进制)。

单位读法字节数标准
KB千字节1,000 BSI(十进制)
KiB基比字节1,024 BIEC(二进制)
MB兆字节1,000,000 BSI(十进制)
MiB兆比特字节1,048,576 BIEC(二进制)
GB千兆字节1,000,000,000 BSI(十进制)
GiB基比字节1,073,741,824 BIEC(二进制)

1MB 和 1MiB 的差异是 48,576 字节(约 4.86%)。对于 10MB 和 10MiB,差异达到约 485KB。当这些差异累积时,在边界值测试中会出现「本应在 10MB 以下的文件被拒绝」的情况。

开发工具、操作系统和云平台的处理差异

使问题复杂化的是,各种工具和操作系统都以自己的方式解释这个单位。

工具 / 环境对「10MB」的理解实际字节数
PHP(php.ini)10MiB10,485,760 B
Nginx(client_max_body_size)10MiB10,485,760 B
Windows 文件浏览器MiB 表示法(记为「MB」)1,048,576 B / MB
macOS FinderMB(十进制)1,000,000 B / MB
AWS S3 管理控制台MiB 显示1,048,576 B / MB
Gmail (附件上限)MB(十进制)25,000,000 B

特别需要注意的是,Windows显示"MB"但实际上计算的是"MiB"。Windows中显示为"9.9 MB"的文件实际上可能是9.9 × 1,048,576 = 10,381,301 字节。这比10MB(10,000,000字节)更大,不会对Gmail(25MB限制)造成问题,但会无法通过PHP的upload_max_filesize = 10M(=10MiB = 10,485,760字节)。

PHP中的实际示例

在 PHP 配置文件中,单位的解释如下。

; php.ini の設定
upload_max_filesize = 10M   ; 10 MiB = 10,485,760 バイト
post_max_size = 12M         ; 12 MiB = 12,582,912 バイト

验证上传文件的大小时,以字节为单位进行比较是最可靠的。

// バイト単位で比較(安全)
$maxBytes = 10 * 1024 * 1024; // 10 MiB = 10,485,760 バイト
if ($_FILES['file']['size'] > $maxBytes) {
    throw new \RuntimeException('ファイルサイズが上限を超えています');
}

// NG: 文字列の "10MB" を解析する場合は単位の解釈に注意

JavaScript 中的实际示例

// File API では size プロパティがバイト数を返す
const file = event.target.files[0];

const MAX_SIZE_MIB = 10 * 1024 * 1024;  // 10 MiB
const MAX_SIZE_MB  = 10 * 1000 * 1000;  // 10 MB

// サーバー側に合わせて単位を統一する
if (file.size > MAX_SIZE_MIB) {
    alert(`ファイルサイズ上限は 10 MiB (${MAX_SIZE_MIB.toLocaleString()} バイト) です`);
}

对边界值测试的影响

在测试「10MB 限制」时,重要的是在选择合适的测试文件之前,先了解服务器的实际限制值。

  • PHP upload_max_filesize = 10M → 上限为 10,485,760 字节 (10 MiB)
  • Gmail 附件上限 → 上限为 25,000,000 字节 (25 MB)
  • Discord 免费计划 → 限制为25,000,000 字节(25 MB)

DevLab 的 阈值测试文件 提供字节单位精确大小的文件。在测试前检查服务器配置,并选择相应的阈值文件。

总结

  • MB = 1,000,000 字节(SI 单位),MiB = 1,048,576 字节(IEC 单位)
  • PHP 和 Nginx 将 "M" 解释为 MiB
  • Windows 显示「MB」但以 MiB 计算
  • macOS 使用 MB(十进制)显示
  • 使用字节级精确的测试文件,并根据服务器设置的解释方式选择

文件大小单位换算表在这里

本文中可用的测试文件

❓ 常见问题

MB(兆字节)与 MiB(美比字节)有什么区别?
MB 是 SI 十进制单位,1MB = 1,000,000 字节;MiB 是 IEC 二进制单位,1MiB = 1,048,576 字节。两者相差约 4.86%,10MB 与 10MiB 相差约 485KB。
PHP 的 upload_max_filesize 设为 10M 是多少字节?
php.ini 中的 10M 被解释为 10MiB,即 10,485,760 字节。Nginx 的 client_max_body_size 写 10m 同样是 10MiB。而 Gmail、Discord 等的 25MB 附件上限则是十进制的 25,000,000 字节。
Windows 与 macOS 显示的文件大小不同吗?
会。Windows 资源管理器标注为「MB」,实际却按 MiB(1,048,576 字节)计算;macOS Finder 则按真正的 MB(1,000,000 字节)显示。同一文件在不同系统下显示的大小因此不同。