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:
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
Bom, a tabela já mostra a diferença. Tentando usar outras palavras:
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
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:
SMALLINT: -32768
a 32767
INT: -2147483648
a 2147483647
SMALLINT: 0
a 65535
INT: 0
a 4294967295
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.
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.
Answered by rbz on August 6, 2020
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP