TransWikia.com

Qual a diferença entre SMALLINT(3) e INT(3)

Stack Overflow em Português Asked by Leonardo Bonetti on August 6, 2020

Estou com uma duvida sobre a diferença entre dois tipos de dados no MySQL:
Esse documento possui essa tabela:

tebela com capacidades dos tipos

A construção padrão desses tipos é SMALLINT(M) e INT(M) onde M = numero máximo de dígitos que o campo irá receber. Preciso armazenar a resolução de uma imagem que pode ser 72, ou 240, ou 300 DPI.

Qual a diferença entre esses dois campos se eu utilizar SMALLINT(3) ou INT(3)? Pois pelo que percebi a grande diferença está em Storage e Min/Max Value Signed

4 Answers

Bom, a tabela já mostra a diferença. Tentando usar outras palavras:

  • o primeiro ocupa 2 bytes e permite 65536 números distintos, geralmente metade para cada lado
  • o segundo ocupa ocupa 4 bytes e permite mais de 4 bilhões de variações sendo que o normal metade negativo e metade positivo. O que diferencia é a capacidade de armazenamento.

A questão do 3 nos parênteses é que será apresentado por padrão com 3 dígitos, o que não faz muito sentido para os dois casos, o 3 faz sentido para o TINYINT. Mas note que é só apresentação, não ocupa menos ou mais espaço, não muda precisão, exatidão, nada disso. É só quando apresenta no banco de dados.

Obviamente não vou repetir o que já está na pergunta.

Correct answer by Maniero on August 6, 2020

Quanto ao quantitativo de caracteres, totalmente de acordo. Quanto ao (3), há duas coisas a se pensar em utilizar isto. Primeiro, você indicando o (3), seu BD vai sempre reservar este espaço específico para aquele valor, seja você incluindo valor com 1 ou 3 caracteres, o que vai melhorar no que se diz respeito à performance das queries, principalmente quando este BD começa a tomar proporções maiores. Agora, se você pensar mais no espaço, sempre que indicar uma quantidade de caracteres específica, este espaço será sempre reservado, ocupando mais espaço em memória do que um campo dinâmico, como 'int()'. Obviamente, com um campo dinâmico, há a questão de que a query vai precisar primeiro verificar a quantidade de caracteres antes de retornar o valor, pois só poderá retornar após o mapeamento.

Resumindo (com exemplos para números inteiros INT):

Int(): Alocará a quantidade de memória dinamicamente, conforme a quantidade de caracteres incluídos.

Int(3): Alocará memória para 3 caracteres, indiferente se incluir 1 ou 999 em seu resultado.

Answered by Bruno Martins on August 6, 2020

de acordo com a progressão, aceitar intervalos de números cada vez maiores.

tinyint = 1 byte
smallint = 2 bytes
mediumint = 3 bytes
int = 4 bytes
bigint = 8 bytes

Answered by A Smythy C Costa on August 6, 2020

A diferença é o intervalo de valores que aceitam (conforme a tabela), ou seja:

Signed

SMALLINT: -32768 a 32767

INT: -2147483648 a 2147483647

Unsigned

SMALLINT: 0 a 65535

INT: 0 a 4294967295


Diferença do Signed para Unsigned

Cada tipo tem seu limite em bytes (ex.: SMALLINT 1 byte).

Signed: "divide" a quantidade possível entre negativos e positivos.

Unsigned: "não divide", assim, aceitando somente números positivos.


Valor entre parêntese

Uma citação bem explicativa (Fonte):

5 - Os valores precisam ser preenchidos com zeros a esquerda ou tem uma largura esperada?

A resposta da quinta pergunta é usada apenas para formatação do número. Se quisermos que os números sejam devolvidos com zeros a esquerda, utilizamos o modificador "ZEROFILL". Já a "largura" dos campos é usada para que a aplicação possa exibir o valor com espaços a esquerda. A largura dos campos é devolvida entre as meta-informações vindas de uma consulta.

A largura é especificada de forma diferente para inteiros e reais. Nos números inteiros, a largura é especificada entre parênteses, após o nome do campo (por exemplo "INT(11)"). Para os números reais, a largura é justamente a precisão do campo (citada anteriormente), a diferença é que o número da precisão passa a ser a largura total do campo, inclusive com a pontuação.

A maior confusão que vejo por aí é a utilização da "largura" do campo achando que ela é a "capacidade máxima de dígitos" do campo. Isso está errado. Ou seja, se o campo é INT(1), INT(2) ou INT(11), seu valor máximo continuará sendo "2.147.483.647". Para especificar campos com maior ou menor capacidade, devem ser usadas as variações do campo (TINYINT, SMALLINT, MEDIUMINT ou BIGINT para campos INT ou usar FLOAT ou DOUBLE para campos de ponto flutuante).

Observação: a opção ZEROFILL aplica automaticamente a opção UNSIGNED no campo, mesmo que você tenha especificado SIGNED explicitamente.


Concluindo sua pergunta:

Poderá usar do SMALLINT ao BIGINT pois todos aceitam os valores: 72, ou 240, ou 300.

O valor entre parêntese (3), significa que sua coluna será limitada em 3 dígitos visíveis, mas os valores continuarão sendo possíveis conforme os limites do campo.


Links úteis

Documentação oficial

Answered by rbz on August 6, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP