Skip to content

MB e MiB são diferentes! Pegadilhas nas unidades de tamanho de arquivo

Categoria:Conhecimento fundamental
Este artigo está disponível atualmente apenas em japonês. As versões traduzidas serão publicadas sequencialmente.

Quando você vê uma especificação dizendo 「O limite de tamanho de arquivo é 10 MB」, como você a interpreta? Na verdade, 「MB」 e 「MiB」 são unidades claramente diferentes, e essa confusão pode causar falhas em testes de valores limite e falhas em produção. Este artigo explica a definição precisa de unidades de tamanho de arquivo e as armadilhas comuns em ambientes de desenvolvimento.

Definição de MB e MiB

Existem dois tipos de unidades para expressar o tamanho do arquivo: o sistema de unidades SI (base decimal) e o sistema de unidades IEC (base binária).

UnidadeComo lerNúmero de bytesPadrão
KBQuilobyte1,000 BSI (decimal)
KiBQuibibyte1,024 BIEC (binário)
MBMegabyte1,000,000 BSI (decimal)
MiBMebibyte1,048,576 BIEC (binário)
GBGigabyte1,000,000,000 BSI (decimal)
GiBGibibyte1,073,741,824 BIEC (binário)

A diferença entre 1MB e 1MiB é <strong>48.576 bytes (aproximadamente 4,86%)</strong>. Para 10MB e 10MiB, a diferença chega a cerca de 485KB. Quando essas diferenças se acumulam, em testes de valores limites, ocorre a situação em que 「um arquivo que deveria ter 10MB ou menos é rejeitado」.

Diferenças no tratamento em ferramentas de desenvolvimento・OS・nuvem

O que complica o problema é que cada ferramenta e SO usa esta unidade com sua própria interpretação.

Ferramentas / AmbienteInterpretação de 「10MB」Número de bytes real
PHP(php.ini)10MiB10,485,760 B
Nginx(client_max_body_size)10MiB10,485,760 B
Windows ExplorerExibição em MiB (notado como 「MB」)1,048,576 B / MB
macOS FinderMB (decimal)1,000,000 B / MB
Console de gerenciamento do AWS S3Exibição em MiB1,048,576 B / MB
Gmail (limite de anexo)MB (decimal)25,000,000 B

Um ponto particularmente importante a observar é que o Windows exibe 「MB」, mas na verdade realiza cálculos em 「MiB」. Um arquivo exibido como 「9.9 MB」 no Windows pode ter na verdade <code>9.9 × 1.048.576 = 10.381.301 bytes</code>. Isso é maior que 10MB (10.000.000 bytes) e não causa problemas nem no Gmail (limite de 25MB), mas pode não passar no PHP com <code>upload_max_filesize = 10M</code> (=10MiB = 10.485.760 bytes).

Exemplo prático em PHP

No arquivo de configuração do PHP, as unidades são interpretadas da seguinte forma.

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

Ao validar o tamanho de um arquivo enviado, é mais seguro comparar em bytes.

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

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

Exemplo prático em 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()} バイト) です`);
}

Impacto no teste de valor limite

Ao testar um 「limite de 10MB」, é importante compreender o limite real do servidor antes de escolher arquivos de teste apropriados.

  • PHP <code>upload_max_filesize = 10M</code> → limite é <strong>10.485.760 bytes (10 MiB)</strong>
  • Limite de anexo do Gmail → O limite é <strong>25.000.000 bytes (25 MB)</strong>
  • Plano gratuito do Discord → Limite é <strong>25.000.000 bytes (25 MB)</strong>

Os <a href="/ja/files/threshold/">arquivos para teste de limite</a> do DevLab fornecem arquivos com tamanhos exatos em bytes. Verifique a configuração do servidor antes do teste e escolha o arquivo de limite correspondente.

Resumo

  • <strong>MB = 1.000.000 bytes</strong>(unidade SI)、<strong>MiB = 1.048.576 bytes</strong>(unidade IEC)
  • PHP e Nginx interpretam 「M」 como <strong>MiB</strong>
  • Windows exibe 「MB」 mas calcula em <strong>MiB</strong>
  • macOS exibe em <strong>MB</strong> (decimal)
  • Use arquivos de teste precisos em nível de byte e selecione conforme a interpretação da configuração do servidor

→ <a href="/ja/reference/file-size-units/">Tabela de conversão de unidades de tamanho de arquivo aqui</a>

Arquivo de teste disponível para usar neste artigo

  • → <a href="/ja/files/threshold/" class="text-primary-600 dark:text-primary-400 hover:underline">Lista de arquivos de teste de limite (9.9MB / 10MB / 10.1MB)</a>

Artigos relacionados

  • → <a href="/ja/blog/how-to-test-upload-limit/" class="text-primary-600 dark:text-primary-400 hover:underline">Como testar corretamente o limite de upload de arquivo</a>
  • → <a href="/ja/blog/multipart-form-data-overhead/" class="text-primary-600 dark:text-primary-400 hover:underline">Calcular com precisão o overhead de multipart/form-data</a>