Qual é o tamanho da coluna int (11) no mysql em bytes?

488

Qual é o tamanho da coluna int(11)no mysql em bytes?

E Valor máximo que pode ser armazenado nessas colunas?

Gaurav
fonte
1
Possível duplicata de Qual é o tamanho de um SQL Int (N)?
Cellepo # 03/16
1
O @cellepo é um sql genérico, o outro é específico para o mysql (além disso, este tem muito mais visualizações). Se você quiser fazer uma caçada e me deixar fechá-los rapidamente em um voto, visite o bate-papo da SOBotics e faça um ping para mim. Mas o que deve ser fechado deve ser marcado mysqlantes da minha chegada. Thx
Drew
6
Ei pessoal. É possivelmente duplicado, mas é mais amigável para pesquisas. A maioria das pessoas pesquisa assim usando int (11). e está resolvendo as questões de outras pessoas. você pode verificar o número de visualizações em comparação com outro. e o usuário encontrará respostas mais detalhadas aqui.
Gaurav #

Respostas:

685

Um INTsempre terá 4 bytes, independentemente do tamanho especificado.

  • TINYINT = 1 byte (8 bits)
  • SMALLINT = 2 bytes (16 bits)
  • MEDIUMINT = 3 bytes (24 bits)
  • INT = 4 bytes (32 bits)
  • BIGINT = 8 bytes (64 bits).

O comprimento apenas especifica quantos caracteres devem ser preenchidos ao selecionar dados com o cliente de linha de comando mysql. 12345 armazenado como int(3)ainda será exibido como 12345, mas, se fosse armazenado int(10), ainda seria exibido como 12345, mas você teria a opção de preencher os cinco primeiros dígitos. Por exemplo, se você adicionouZEROFILL incluísse, seria exibido como 0000012345.

... e o valor máximo será 2147483647 (assinado) ou 4294967295 (não assinado)

Matt MacLean
fonte
111
então qual é o significado de 11 em int (11) aqui.
Gaurav
73
Na coluna INT (4), o número inteiro 1 seria exibido como 0001 SOMENTE se a coluna também fosse especificada como zerofill. Caso contrário, ele será exibido apenas como número 1, sem dígitos extras. @ Gaurav - não misture como o mysql exibe dados e como os armazena, essas são duas coisas diferentes. O que você vê não é o que realmente pode ser.
Michael JV
13
@ Michael Wow, muito interessante. Portanto, se você criar uma coluna INT (3) e armazenar um valor 5001, ele armazenará 5001, mas exibirá apenas 1. Eu não sabia disso.
precisa saber é o seguinte
16
@andrewtweber: 5001será exibido como 5001se o campo estiver definido como INT(3). Veja a resposta @priyabagus abaixo e aqui .
Go2null
10
Se você não fornecer um comprimento para campos inteiros, o MySQL definirá um valor padrão (tinyint 4, smallint 6, mediumint 9, int 11, bigint 20). Vale a pena notar que esses comprimentos padrão são suficientes para exibir qualquer número que pode ser armazenado neste campo (por exemplo: smallint max value é 2 ^ 16 = 65536, 5 dígitos) A menos que você tenha um bom motivo para fazê-lo, recomendo deixar os tamanhos padrão para evitar surpresas ruins.
Thibault Witzig
167

INT ( x ) fará diferença apenas em termos de exibição , ou seja, para mostrar o número em dígitos x , e não restrito a 11. Você o emparelha usando ZEROFILL, o que precederá os zeros até corresponder ao seu comprimento.

Portanto, para qualquer número de x emINT(x)

  • se o valor armazenado tiver menos dígitos que x , ZEROFILLprecederá zeros.

    INT (5) ZEROFILL com o valor armazenado de 32 mostrará 00032
    INT (5) com o valor armazenado de 32 mostrará 32
    INT com o valor armazenado de 32 mostrará 32

  • se o valor armazenado tiver mais dígitos que x , será mostrado como está.

    INT (3) ZEROFILL com o valor armazenado de 250000 mostrará 250000
    INT (3) com o valor armazenado de 250000 mostrará 250000
    INT com o valor armazenado de 250000 mostrará 250000

O valor real armazenado no banco de dados não é afetado, o tamanho ainda é o mesmo e qualquer cálculo se comportará normalmente.

Isso também se aplica a BIGINT, MEDIUMINT, SMALLINT e TINYINT.

priyabagus
fonte
49
Portanto, o comprimento não faz absolutamente nada, a menos que você use o zerofill?
developerbmw
29
@developerbmw - Correto. O comprimento não faz absolutamente nada, a menos que você use ZEROFILL.
Rick James
O ZEROFILL é essencialmente o modo de compatibilidade de mainframe.
Henk Poley
114

De acordo com aqui , int(11)serão necessários 4 bytes de espaço, que são 32 bits de espaço com 2^(31) = 2147483648valor máximo e -2147483648valor mínimo. Um pouco é para sinal.

Santosh Linkha
fonte
1
Seu exemplo tem 9 noves. Você pode confirmar que seu exemplo está correto? Se sim, por que diz 10 quando existem 9 noves? É o número de dígitos mais um mais o caractere de sinal?
Homer6
5
Não, o número máximo é 4294967295 se não tiver assinado int, ou seja, 2 ^ 32. O número entre colchetes não afeta o tipo de armazenamento. Se você precisar de mais de 2 ^ 32, precisará ir para bigint.
Kieran Tully
7
Ou melhor, (2 ^ 32) -1.
Kieran Tully
2
+ Kieran está certo. O número máximo é diferente do da resposta. Veja aqui
daviewales
38

Como já foi dito, os valores mínimos / máximos que a coluna pode armazenar e a quantidade de armazenamento necessária em bytes é definida apenas pelo tipo, não pelo comprimento.

Muitas dessas respostas estão dizendo que a (11)peça afeta apenas a largura da tela, que não é exatamente verdadeira, mas principalmente.

A definição de int(2)com nenhuma zerofill especificado irá:

  • ainda aceita um valor de 100
  • ainda exibe um valor de 100quando a saída (não 0ou 00)
  • a largura de exibição será a largura do maior valor produzido na consulta de seleção.

A única coisa que (2)você fará é se zerofill também for especificado :

  • um valor de 1será mostrado 01.
  • Ao exibir valores, a coluna sempre terá uma largura do valor máximo possível que a coluna poderia levar, com 10 dígitos para um número inteiro, em vez da largura mínima necessária para exibir o maior valor que a coluna precisa mostrar nessa consulta de seleção específica , que poderia ser muito menor.
  • A coluna ainda pode receber e mostrar um valor que excede o comprimento, mas esses valores não serão prefixados com 0s.

A melhor maneira de ver todas as nuances é executar:

CREATE TABLE `mytable` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `int1` int(10) NOT NULL,
    `int2` int(3) NOT NULL,
    `zf1` int(10) ZEROFILL NOT NULL,
    `zf2` int(3) ZEROFILL NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `mytable` 
(`int1`, `int2`, `zf1`, `zf2`) 
VALUES
(10000, 10000, 10000, 10000),
(100, 100, 100, 100);

select * from mytable;

que produzirá:

+----+-------+-------+------------+-------+
| id | int1  | int2  | zf1        | zf2   |
+----+-------+-------+------------+-------+
|  1 | 10000 | 10000 | 0000010000 | 10000 |
|  2 |   100 |   100 | 0000000100 |   100 |
+----+-------+-------+------------+-------+

Esta resposta foi testada no MySQL 5.7.12 para Linux e pode ou não variar para outras implementações.

Programador
fonte
5
"Observe como a coluna int1 tem uma largura de exibição muito menor que o zerofill2, mesmo que o comprimento seja maior" ... Ehm, isso acontece porque o nome da coluna 'zerofill2' tem 9 caracteres e vs 'int1' sendo 4.
neokio
2
... sim, o comprimento claramente não tem efeito, mesmo na largura da tela quando o zerofill não está ativado. Caso contrário, int1 seria muito mais amplo, com uma largura de 10 caracteres.
Programster
2
Uma boa explicação com um exemplo sólido. Resposta muito melhor do que a aceita. Obrigado @Programster.
Corin
Nit menor: Como neokio aponta, não é possível observar nesta consulta as conseqüências exatas de "int (3)" com preenchimento zero. Reduza o nome da coluna para "zf2", para tornar o comportamento mais claro. Especificamente, seja verdadeiro ou falso [na versão de banco de dados especificada] que "(com zerofill) Ao exibir valores, a coluna sempre terá uma largura do valor máximo possível que a coluna poderia levar, com 10 dígitos para um número inteiro"
ToolmakerSteve
1
Para esclarecer o comentário de neokio e meu pequeno comentário secundário: A frase "Observe como a coluna int1 tem uma largura de exibição muito menor que zerofill2, mesmo que o comprimento seja maior". deve ser removido da resposta. Isso é uma consequência do número de caracteres na palavra do cabeçalho "zerofill2" - não tem nada a ver com o teste das larguras de exibição. Melhor atribuir um nome mais curto a essa coluna, por exemplo, "zf2". Então teríamos uma tabela em que "int1, int2 e zf2 são todos exatamente da mesma largura, embora int2 e zf2 especifiquem uma largura pequena (3)".
Página
32

Qual é o tamanho da coluna int (11) no mysql em bytes?

(11)- este atributo do inttipo de dados não tem nada a ver com o tamanho da coluna. É apenas a largura de exibição do tipo de dados inteiro. A partir de 11.1.4.5. Atributos de tipo numérico :

O MySQL suporta uma extensão para especificar opcionalmente a largura de exibição de tipos de dados inteiros entre parênteses, seguindo a palavra-chave base para o tipo. Por exemplo, INT (4) especifica um INT com uma largura de exibição de quatro dígitos.

ks1322
fonte
19

Uma boa explicação para isso pode ser encontrada aqui

Para resumir: O número N em int (N) geralmente é confundido pelo tamanho máximo permitido para a coluna, como ocorre no caso de varchar (N).

Mas esse não é o caso dos tipos de dados Inteiros - o número N entre parênteses não é o tamanho máximo da coluna, mas simplesmente um parâmetro para informar ao MySQL qual largura exibir a coluna quando os dados da tabela estiverem sendo visualizados através do MySQL console (quando você estiver usando o atributo ZEROFILL).

O número entre colchetes dirá ao MySQL quantos zeros devem ser preenchidos com números inteiros recebidos. Por exemplo: Se você estiver usando ZEROFILL em uma coluna definida como INT (5) e o número 78 for inserido, o MySQL preencherá esse valor com zeros até que o número satisfaça o número entre colchetes. ou seja, 78 se tornará 00078 e 127 se tornará 00127. Para resumir: O número entre colchetes é usado para fins de exibição.
De certa forma, o número entre colchetes é meio inútil, a menos que você esteja usando o atributo ZEROFILL.

Portanto, o tamanho para o int permaneceria o mesmo, ou seja, -2147483648 a 2147483648 para assinados e 0 a 4294967295 para não assinado(~ 2,15 bilhões e 4,2 bilhões, que é uma das razões pelas quais os desenvolvedores desconhecem a história por trás do Número N entre parênteses, pois dificilmente afeta o banco de dados, a menos que contenha mais de 2 bilhões de linhas) e, em termos de bytes, seria de 4 bytes .

Para mais informações sobre tamanho / faixa de Tipos Inteiros, consulte o Manual do MySQL.

shashi009
fonte
Por que o número de linhas entra em jogo aqui?
Old Geezer
@ OldGeezer - concordo, "número de linhas" é irrelevante para a maioria das colunas. Somente relevante para a coluna de chave primária (ID) de incremento automático.
ToolmakerSteve
10

Embora seja improvável que essa resposta seja vista, acho que vale a pena fazer os seguintes esclarecimentos:

  • o (n) por trás de um tipo de dados inteiro no MySQL está especificando a largura de exibição
  • a largura da tela NÃO limita o comprimento do número retornado de uma consulta
  • a largura de exibição limita o número de zeros preenchidos para uma coluna preenchida com zero, para que o número total corresponda à largura de exibição (desde que o número real não exceda a largura de exibição, nesse caso, o número é mostrado como está)
  • a largura da tela também é uma ferramenta útil para os desenvolvedores saberem a que comprimento o valor deve ser aumentado

UM POUCO DE DETALHE,
a largura de exibição é, aparentemente, destinada a fornecer alguns metadados sobre quantos zeros serão exibidos em um número preenchido com zero.
Na verdade, NÃO limita o tamanho de um número retornado de uma consulta se esse número ultrapassar a largura de exibição especificada.
Para saber qual comprimento / largura é realmente permitido para um tipo de dados inteiro no MySQL, consulte a lista e o link: ( tipos: TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT );
Dito isso, você pode esperar que a largura da exibição não afete os resultados de uma consulta padrão, a menos que as colunas sejam especificadas como colunas ZEROFILL
OU
no caso de os dados serem puxados para um aplicativo e esse aplicativo estar coletando o largura de exibição a ser usada para algum outro tipo de preenchimento.

Referência principal: https://blogs.oracle.com/jsmyth/entry/what_does_the_11_mean

MER
fonte
Obrigado por fornecer a resposta adequada. Eu estava tentando a partir da linha de comando do MySQL, e não conseguia cortar nenhum dígito com nletras pequenas , então ... sim, isso é besteira. Ele só faz qualquer coisa com zerofill.
MPEN
@mpen feliz por poder ajudar, isso estava relacionado a algo que eu estava tentando e achei que poderia colocar mais detalhes aqui que podem ser úteis para outra pessoa.
26616 MER
9

No número inteiro do MySQL int(11), o tamanho é de 4 bytes, o que equivale a 32 bits.

O valor assinado é: - 2^(32-1) to 0 to 2^(32-1)-1 = -2147483648 to 0 to 2147483647

Os valores não assinados são: 0 to 2^32-1 = 0 to 4294967295

Sachin Agrawal
fonte
0

de acordo com este livro :

O MySQL permite especificar uma "largura" para tipos inteiros, como INT (11). Isso não faz sentido para a maioria das aplicações: não restringe a faixa legal de valores, mas simplesmente especifica o número de caracteres que as ferramentas interativas do MySQL reservam para fins de exibição. Para fins de armazenamento e computação, INT (1) é idêntico a INT (20).

Alireza Rahmani Khalili
fonte
-4

Acho valor máximo de int (11) é 4294967295

Samuel
fonte
2
É 2147483647 porque tem sinal.
d3bit
-9

4294967295 é a resposta, porque int (11) mostra o máximo de 11 dígitos IMO

Dudee
fonte