Qual è la dimensione della colonna di int (11) in mysql in byte?


488

Qual è la dimensione della colonna di int(11)in mysql in byte?

E il valore massimo che può essere memorizzato in questa colonna?



1
@cellepo uno è sql generico l'altro è specifico per mysql (in più questo ha molte più visualizzazioni). Se vuoi andare a caccia dupe e farmi chiudere rapidamente con un voto, visita la chat di SOBotics e eseguimi il ping. Ma quello da chiudere deve essere taggato mysqlprima del mio arrivo. Grazie
Estratto il

6
Hey ragazzi. È forse duplicato, ma è più intuitivo per la ricerca. La maggior parte delle persone cerca in questo modo usando int (11). e sta risolvendo le domande di altre persone. puoi controllare il suo numero di vista rispetto ad un altro. e l'utente troverà una risposta più dettagliata qui.
Gaurav,

Risposte:


685

Un INTsarà sempre di 4 byte, indipendentemente dalla lunghezza specificata.

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

La lunghezza specifica solo quanti caratteri riempire quando si selezionano i dati con il client della riga di comando mysql. 12345 memorizzato come int(3)verrà comunque visualizzato come 12345, ma se fosse memorizzato come int(10)sarebbe ancora visualizzato come 12345, ma si avrebbe la possibilità di riempire le prime cinque cifre. Ad esempio, se aggiunto ZEROFILL, verrà visualizzato come 0000012345.

... e il valore massimo sarà 2147483647 (Firmato) o 4294967295 (Non firmato)


111
allora qual è il significato di 11 in int (11) qui.
Gaurav,

73
Colonna INT (4), il numero intero 1 verrebbe visualizzato SOLO 0001 se la colonna fosse specificata anche come zerofill. Altrimenti, verrà visualizzato come numero 1, senza cifre aggiuntive. @Gaurav - non mescolare il modo in cui mysql visualizza i dati e come li memorizza, sono due cose diverse. Quello che vedi non è quello che potrebbe davvero essere.
Michael JV,

13
@Michael Wow, davvero interessante. Quindi, se crei una colonna INT (3) e memorizzi un valore 5001, memorizzerà 5001 ma visualizzerà solo 1. Non lo sapevo.
andrewtweber,

16
@andrewtweber: 5001verrà visualizzato come 5001anche se il campo è definito come INT(3). Vedi la risposta di @priyabagus qui sotto e qui .
go2null,

10
Se non fornisci una lunghezza per i campi interi, MySQL imposterà un valore predefinito (tinyint 4, smallint 6, mediumint 9, int 11, bigint 20) È degno di nota che queste lunghezze predefinite sono sufficienti per visualizzare qualsiasi numero che può essere memorizzato in questo campo (es: il valore massimo di smallint è 2 ^ 16 = 65536, 5 cifre) A meno che tu non abbia un ottimo motivo per fare diversamente, ti consiglierei di lasciare le dimensioni predefinite per evitare brutte sorprese.
Thibault Witzig,

167

INT ( x ) farà la differenza solo in termini di visualizzazione , cioè per mostrare il numero in x cifre, e non limitato a 11. Lo ZEROFILLabbini usando , il che anteporrà gli zeri fino a quando non corrispondono alla tua lunghezza.

Quindi, per qualsiasi numero di x inINT(x)

  • se il valore memorizzato ha meno cifre di x , ZEROFILLanteporrà gli zeri.

    INT (5) ZEROFILL con il valore memorizzato di 32 mostrerà 00032
    INT (5) con il valore memorizzato di 32 mostrerà 32
    INT con il valore memorizzato di 32 mostrerà 32

  • se il valore memorizzato ha più cifre di x , verrà mostrato così com'è.

    INT (3) ZEROFILL con il valore memorizzato di 250000 mostrerà 250000
    INT (3) con il valore memorizzato di 250000 mostrerà 250000
    INT con il valore memorizzato di 250000 mostrerà 250000

Il valore effettivo memorizzato nel database non è interessato, la dimensione è sempre la stessa e qualsiasi calcolo si comporterà normalmente.

Questo vale anche per BIGINT, MEDIUMINT, SMALLINT e TINYINT.


49
Quindi la lunghezza non fa assolutamente nulla a meno che non usi zerofill?
Developerbmw

29
@developerbmw - Corretto. La lunghezza non fa assolutamente nulla a meno che non si usi ZEROFILL.
Rick James,

ZEROFILL è essenzialmente la modalità di compatibilità mainframe.
Henk Poley, il

114

Secondo qui , int(11)richiederà 4 byte di spazio, ovvero 32 bit di spazio con 2^(31) = 2147483648valore massimo e -2147483648valore minimo. Un bit è per il segno.


1
Il tuo esempio ha 9 nove. Potete per favore confermare che il vostro esempio è corretto? Se è così, perché dice 10 quando ci sono 9 nove? È il numero di cifre più una più il carattere del segno?
Homer6,

5
No, il numero massimo è 4294967295 se int senza segno, ovvero 2 ^ 32. Il numero tra parentesi non influisce sul tipo di archiviazione. Se hai bisogno di più di 2 ^ 32, devi andare su bigint.
Kieran Tully,

7
O meglio, (2 ^ 32) -1.
Kieran Tully,

2
+ Kieran ha ragione. Il numero massimo è diverso da quello nella risposta. Vedi qui
daviewales,

38

Come altri hanno già detto, i valori minimi / massimi che la colonna può memorizzare e la quantità di memoria necessaria in byte è definita solo dal tipo, non dalla lunghezza.

Molte di queste risposte affermano che la (11)parte influisce solo sulla larghezza del display, il che non è esattamente vero, ma soprattutto.

Una definizione di int(2)con nessun ZEROFILL specificato dovrà:

  • accetta ancora un valore di 100
  • visualizza ancora un valore di 100quando output (no 0o 00)
  • la larghezza di visualizzazione sarà la larghezza del valore più grande generato dalla query di selezione.

L'unica cosa (2)che farà è se viene specificato anche zerofill :

  • 1verrà mostrato un valore di 01.
  • Quando vengono visualizzati i valori, la colonna avrà sempre una larghezza del valore massimo possibile che la colonna potrebbe assumere, ovvero 10 cifre per un numero intero, anziché la larghezza minima richiesta per visualizzare il valore più grande che la colonna deve mostrare in quella specifica query di selezione , che potrebbe essere molto più piccolo.
  • La colonna può ancora richiedere e mostrare un valore superiore alla lunghezza, ma questi valori non avranno il prefisso 0.

Il modo migliore per vedere tutte le sfumature è eseguire:

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;

che produrrà:

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

Questa risposta è testata contro MySQL 5.7.12 per Linux e può variare o meno per altre implementazioni.


5
"Nota come la colonna int1 ha una larghezza di visualizzazione molto più piccola di zerofill2 anche se la lunghezza è più grande" ... Ehm, questo è solo perché il nome della colonna 'zerofill2' è lungo 9 caratteri, mentre 'int1' è 4.
neokio

2
... sì, quindi chiaramente la lunghezza non ha alcun effetto, anche sulla larghezza del display quando zerofill non è abilitato. Altrimenti int1 sarebbe invece molto più ampio con una larghezza di 10 caratteri.
Programster,

2
Una buona spiegazione con un solido esempio. Risposta decisamente migliore di quella accettata. Grazie @Programster.
Corin,

Minor nit: Come sottolinea Neokio, da questa query non è possibile osservare le esatte conseguenze di "int (3)" con riempimento zero. Abbreviare il nome della colonna in "zf2", per rendere più chiaro il comportamento. In particolare, sia vero che falso [sulla data versione DB] che "(con zerofill) Quando si visualizzano i valori, la colonna avrà sempre una larghezza del valore massimo possibile che la colonna potrebbe assumere che è di 10 cifre per un numero intero",
ToolmakerSteve

1
Per chiarire il commento di neokio e il mio piccolo commento nit: La frase "Nota come la colonna int1 ha una larghezza di visualizzazione molto più piccola di zerofill2 anche se la lunghezza è maggiore." dovrebbe essere rimosso dalla risposta. Questa è una conseguenza del numero di caratteri nell'intestazione "zerofill2" - non ha nulla a che fare con il test delle larghezze di visualizzazione. Meglio assegnare a quella colonna un nome più breve, ad esempio "zf2". Quindi avremmo una tabella in cui "int1, int2 e zf2 hanno esattamente la stessa larghezza, anche se int2 e zf2 specificano una larghezza ridotta (3)".
ToolmakerSteve

32

Qual è la dimensione della colonna di int (11) in mysql in byte?

(11)- questo attributo del inttipo di dati non ha nulla a che fare con la dimensione della colonna. È solo la larghezza di visualizzazione del tipo di dati intero. Da 11.1.4.5. Attributi di tipo numerico :

MySQL supporta un'estensione per specificare facoltativamente la larghezza di visualizzazione dei tipi di dati interi tra parentesi seguendo la parola chiave di base per il tipo. Ad esempio, INT (4) specifica un INT con una larghezza di visualizzazione di quattro cifre.


19

Una buona spiegazione per questo può essere trovata qui

Per riassumere: Il numero N in int (N) è spesso confuso dalla dimensione massima consentita per la colonna, come nel caso di varchar (N).

Ma questo non è il caso dei tipi di dati Integer: il numero N tra parentesi non è la dimensione massima per la colonna, ma semplicemente un parametro per indicare a MySQL quale larghezza visualizzare la colonna quando i dati della tabella vengono visualizzati tramite MySQL console (quando si utilizza l'attributo ZEROFILL).

Il numero tra parentesi indica a MySQL con quanti zeri è necessario riempire gli interi in entrata. Ad esempio: se si utilizza ZEROFILL su una colonna impostata su INT (5) e viene inserito il numero 78, MySQL riempie quel valore con zeri fino a quando il numero non soddisfa il numero tra parentesi. vale a dire 78 diventerà 00078 e 127 diventerà 00127. Per riassumere: il numero tra parentesi viene utilizzato a scopo di visualizzazione.
In un certo senso, il numero tra parentesi è un po 'inutile a meno che non si stia utilizzando l'attributo ZEROFILL.

Quindi la dimensione per int rimarrebbe la stessa, cioè da -2147483648 a 2147483648 per firmata e da 0 a 4294967295 per non firmata(~ 2,15 miliardi e 4,2 miliardi, che è uno dei motivi per cui gli sviluppatori rimangono inconsapevoli della storia dietro il numero N tra parentesi, poiché non influenza quasi nulla sul database a meno che non contenga più di 2 miliardi di righe) e in termini di byte sarebbe 4 byte .

Per ulteriori informazioni sulla dimensione / intervallo dei tipi di numeri interi, consultare il Manuale MySQL


Perché il numero di righe entra in gioco qui?
Old Geezer,

@OldGeezer - d'accordo, "il numero di righe" è irrilevante per la maggior parte delle colonne. Rilevante solo per la colonna chiave primaria (id) a incremento automatico.
ToolmakerSteve

10

Sebbene sia improbabile che questa risposta sia visibile, penso che valga la pena di chiarire quanto segue:

  • il (n) dietro un tipo di dati intero in MySQL sta specificando la larghezza di visualizzazione
  • la larghezza di visualizzazione NON limita la lunghezza del numero restituito da una query
  • la larghezza di visualizzazione limita il numero di zero riempiti per una colonna riempita di zero in modo che il numero totale corrisponda alla larghezza di visualizzazione (purché il numero effettivo non superi la larghezza di visualizzazione, nel qual caso il numero viene visualizzato così com'è)
  • la larghezza di visualizzazione è anche intesa come uno strumento utile per gli sviluppatori per sapere a quale lunghezza deve essere inserito il valore

A BIT OF DETAIL,
la larghezza del display è, apparentemente, destinata a fornire alcuni metadati su quanti zeri visualizzare in un numero pieno di zero.
In realtà NON limita la lunghezza di un numero restituito da una query se quel numero supera la larghezza di visualizzazione specificata.
Per sapere quale lunghezza / larghezza è effettivamente consentita per un tipo di dati intero in MySQL consultare l'elenco e il collegamento: ( tipi: TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT );
Detto questo, puoi aspettarti che la larghezza di visualizzazione non abbia alcun effetto sui risultati di una query standard, a meno che le colonne non siano specificate come colonne ZEROFILL
O
nel caso in cui i dati vengano estratti in un'applicazione e quell'applicazione raccolga larghezza di visualizzazione da utilizzare per qualche altro tipo di imbottitura.

Riferimento primario: https://blogs.oracle.com/jsmyth/entry/what_does_the_11_mean


Grazie per aver fornito la risposta corretta. Ci stavo provando dalla riga di comando di MySQL, e non sono riuscito a far saltare le cifre con piccole cifre n, quindi ... sì, questo è bullcrap. Fa solo qualsiasi cosa con zerofill.
aprono il

@mpen contento di poterti aiutare, questo era legato a qualcosa che stavo provando e ho pensato di poter inserire qui maggiori dettagli che potrebbero essere utili a qualcun altro.
MER,

9

In numero intero MySQL int(11) ha una dimensione di 4 byte che equivale a 32 bit.

Il valore firmato è: - 2^(32-1) to 0 to 2^(32-1)-1 = -2147483648 to 0 to 2147483647

I valori senza segno sono: 0 to 2^32-1 = 0 to 4294967295


0

secondo questo libro :

MySQL ti consente di specificare una "larghezza" per i tipi interi, come INT (11). Questo non ha senso per la maggior parte delle applicazioni: non limita l'intervallo legale di valori, ma specifica semplicemente il numero di caratteri che gli strumenti interattivi di MySQL riserveranno ai fini della visualizzazione. Per scopi di archiviazione e calcolo, INT (1) è identico a INT (20).


-4

Penso che il valore massimo di int (11) sia 4294967295


2
È 2147483647 perché ha un segno.
d3bit

-9

4294967295 è la risposta, perché int (11) mostra un massimo di 11 cifre IMO

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.