コンテンツにスキップ

MBとMiBは違う!ファイルサイズ単位の落とし穴

カテゴリ:基礎知識

「ファイルサイズの上限は10MBです」という仕様書を見たとき、あなたはどう解釈しますか? 実は「MB」と「MiB」は明確に異なる単位であり、この混同が原因で境界値テストの失敗や本番障害が発生するケースがあります。この記事では、ファイルサイズ単位の正確な定義と、開発現場でよくある落とし穴を解説します。

MB と MiB の定義

ファイルサイズを表す単位には、SI単位系(10進数ベース)とIEC単位系(2進数ベース)の2種類があります。

単位読み方バイト数規格
KBキロバイト1,000 BSI(10進数)
KiBキビバイト1,024 BIEC(2進数)
MBメガバイト1,000,000 BSI(10進数)
MiBメビバイト1,048,576 BIEC(2進数)
GBギガバイト1,000,000,000 BSI(10進数)
GiBギビバイト1,073,741,824 BIEC(2進数)

1MBと1MiBの差は 48,576バイト(約4.86%) です。10MBと10MiBでは差が約485KBにもなります。この差が積み重なると、境界値テストで「10MB以下のファイルのはずが拒否された」という事態が起きます。

開発ツール・OS・クラウドでの扱いの違い

問題を複雑にするのは、各ツールやOSがこの単位を独自の解釈で使っていることです。

ツール / 環境「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(10進数)1,000,000 B / MB
AWS S3 管理コンソールMiB表示1,048,576 B / MB
Gmail(添付上限)MB(10進数)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(10進数)で表示する
  • テスト用ファイルはバイト単位で正確なものを使い、サーバー設定の解釈に合わせて選択する

ファイルサイズ単位変換表はこちら

この記事で使えるテストファイル

📚 関連記事

PNG vs WebP vs AVIF|画像フォーマットの選び方と変換方法

PNG / JPEG / WebP / AVIF の特徴・用途・ブラウザ対応状況を比較。picture 要素での出し分け、DevLab の画像フォーマット変換ツールの使い方も解説。

2026-04-18

Whois でドメイン情報を調べる方法|有効期限・ネームサーバー・登録者

Whois でわかること (登録者・有効期限・レジストラ・NS)、GDPR によるプライバシー保護の影響、ドメイン管理の実務的な使い方を解説。

2026-04-18

HTTP ステータスコード完全ガイド|よくあるエラーの原因と対処法

開発者が頻出する HTTP ステータスコード (200/301/302/400/401/403/404/413/422/429/500/502/503/504) の意味・原因・対処法を解説。301 vs 302 の SEO 影響、400 vs 422 の使い分けも。

2026-04-18

cURL コマンドを JavaScript fetch・Python requests に変換する方法|DevTools 連携

Chrome DevTools の Copy as cURL を fetch / axios / Python requests / PHP cURL / Go net/http に変換する手順を解説。主要 cURL オプション (-X / -H / -d / -F / -u / -b / -L) の変換パターン、認証トークンの扱い、注意点まで。

2026-04-16

Cookie のセキュリティフラグ完全ガイド|Secure / HttpOnly / SameSite / __Host-

Cookie のセキュリティ属性 Secure / HttpOnly / SameSite (Strict/Lax/None) / __Host- __Secure- プレフィックス / 4096 バイト制限を解説。CSRF / XSS / セッションハイジャック対策と、Laravel / Express の実装例。

2026-04-16

JWT のセキュリティベストプラクティス|alg none 攻撃 / 有効期限 / 署名検証

JWT (JSON Web Token) の代表的な脆弱性 6 種類 (alg none 攻撃 / 鍵混同 / 無期限トークン / payload への機密情報 / 失効不可 / 弱いシークレット) と対策。リフレッシュトークンパターン、失効リスト、HttpOnly Cookie 格納まで。

2026-04-16