Newsgroup: it.comp.www.php
Titolo: [OT] Info su BIGINT, INT, etc.

Salve,
 
<NEWBIE>
 
volevo una delucidazione sul concetto dei RDBMS tipo MySQL/MariaDB di 
seguito un esempio:
 
CREATE TABLE users
(
id_user BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(25),
surname VARCHAR(25),
FK_id_city INT(10) UNSIGNED NOT NULL,
INDEX (FK_id_city),
FOREIGN KEY (FK_id_city) REFERENCES cities (id_city)
)
ENGINE=INNODB;
 
Io mi immagino visivamente un database come un foglio di excel/calc con 
tante colonne quante sono i campi quindi la colonna id_user che è un 
BIGINT può avere molti più valori di quanti ne possa avere la colonna 
FK_id_city!
 
Ipotizzando di avere come valore massimo di BIGINT 100 e di INT 60 al 
sessantunesimo inserimento avrei un errore o sbaglio?
 
</NEWBIE>
 
Saluti!
^Bart

Il 26/10/19 14:28, ^Bart ha scritto:

no
 
una tabella di tipo innodb (engine) può contenere miliardi di record.
id_user definito bigint unsigned vuol dire che può assumere come valore 
massimo 18446744073709551615
fk_id_city definito int può assumere -2^31 (-2,147,483,648) to 2^31-1 
(2,147,483,647)
 
Saluti

sessantunesimo inserimento avrei un errore o sbaglio?
 
Non sbagli. Ma id_user è un contatore utenti, id_city è un contatore città;
se prevedi di poter avere più di 60 città, sbagli ad usare il tipo INT.
 
Nel caso reale, BIGINT arriva a uno stonfo di numeri e INT fino a oltre due
miliardi, sicché il problema non si pone.
 
Con BIGINT puoi dare svariati ID a ogni singolo essere umano mai esistito.
 
Leonardo
-- 
 
"You all presumably know why" :-) :-(

 Leonardo
 
Saluti!
^Bart
 

 Saluti
 
Saluti e... grazie ancora per la pazienza! :D
 
^Bart

 banale viene! :)
 
Ho trovato la suluzione qui: 
https://stackoverflow.com/questions/5634104/what-is-the-size-of-column-of-int11-in-mysql-in-bytes
 
 
Morale della favola in un campo INT(10) UNSIGNED potrei scrivere un 
numero fino a dieci cifre quindi 9999999999 per un totale di inserimenti 
pari a 4294967295 valori!
 
Quindi facendo questa ipotesi di tabella:
 
users
-------------------------------
id_user name 	personal_number
1	Peter   9991234569
2	John	
2345435439
 
 
Nel caso volessi memorizzare personal_number come numero sarei costretto 
ad usare lo stesso valore di id_user quindi per entrambi INT o per 
entrambi BIGINT ed in generale sarebbe meglio usare l'opzione ZEROFILL 
in modo che 1 diventi 0000000001 e che si possa quindi mettere in ordine 
crescente/decrescente senza problemi.
 
Saluti!
^Bart

 il numero 4294967295 perché formato da dieci cifre...
 
Credo di aver finalmente trovato la quadra, INT(60) UNSIGNED significa 
che potrei memorizzare tanti numeri fino ad un massimo di 	4294967295 
con una lunghezza massima di ognuno di 60 cifre!
 
Saluti!
^Bart

 ^Bart
 

 Saluti
 
Ragionandoci sopra ho capito gli errori concettuali che compivo!
 
Saluti!
^Bart


No: INT(60) significa che puoi memorizzare un massimo di 4294967295 (quindi
nove cifre "e mezza"). Il Display Width ha senso solo se è PIU' PICCOLO del
massimo numero di cifre rappresentabili. Che so: INT(8) o INT(6). Credo sia
compreso il segno, quindi INT(11) ha senso.
 
Ma forse prima è meglio chiarire un altro punto: "cos'è che ti serve"?


 valore massimo di cifre memorizzabile con tale tipologia è di 10!
 
Un suggerimento spassionato: ignora quel numero tra parentesi.
 
Guarda qui per sapere il numero massimo per ogni tipo intero:
 
https://dev.mysql.com/doc/refman/8.0/en/integer-types.html
 
 
Tutto il resto è fuffa. :)
 
Bye.

 Bye.
 
Saluti!
^Bart

 Leonardo
 
Saluti!
^Bart
 

potrò memorizzare un numero fino a 60 cifre
 
No, che in quella cella ci puoi mettere un INT. Siccome gli INT sono numeri da
-2miliardiespicci a +2miliardiespicci, in quella cella ci potrai mettere tutto
quello che vuoi... purché sia un numero intero compreso fra +/- 2mldcirca.
 
Se ci vuoi mettere qualcos'altro, devi cambiare tipo di dato.
 
Specificare INT(60) non ti serve a nulla: fa conto che "INT" sia un boccale da
undici litri. Puoi dire al barista di metterci cinque litri - INT(5) - come di
mettercene 20 - INT(20). Ma ora indovina cosa succede quando versi 20 litri di
birra in un boccale da 11?


 TINYINT, etc.
 
Devi usarlo come id? Allora fatti questa domanda.
Quante righe pensi di metterci (ora e in futuro)?
Meno di 4 miliardi? Usa INT UNSIGNED.
Più di 4 miliardi? Usa BIGINT UNSIGNED.
 
Non vale la pena usare gli altri tipi per un id (o AUTO INCREMENT, come
lo chiama MySQL), sia perché noi umani siamo pessimi a predire il
futuro, sia perchè dimensioni inferiori non portano nessun guadagno
prestazionale o di occupazione del disco significativi.
 
Bye.