type - number column mysql




La colonna INT(3) non taglia il valore alla lunghezza appropriata e consente di inserire il valore completo-MySQL (2)

Ho una colonna INT (3) UNSIGNED. Se inserisco un valore con lunghezza caratteri maggiore di 3, non ritaglia questo valore ma lo inserisce.

Cosa sta succedendo?


Da cosa significa "dimensione" in int (dimensione) di MySQL?

Infine, veniamo al posto del manuale dove c'è il suggerimento più grande su cosa significhi il numero:

Molte delle descrizioni dei tipi di dati utilizzano queste convenzioni:

M indica la larghezza massima di visualizzazione per i tipi interi. Per i tipi a virgola mobile e a virgola fissa, M è il numero totale di cifre che è possibile memorizzare. Per i tipi di corda, M è la lunghezza massima. Il valore massimo consentito di M dipende dal tipo di dati.

Riguarda la larghezza del display. La cosa strana è, comunque, che, ad esempio, se si ha un valore di 5 cifre in un campo con una larghezza di visualizzazione di 4 cifre, la larghezza del display non taglierà le cifre.

Se il valore ha meno cifre rispetto alla larghezza del display, non accade nulla. Quindi sembra che il display non abbia alcun effetto nella vita reale.

Now2 ZEROFILL entra in gioco. È una funzione accurata che applica valori che sono (qui viene) meno della larghezza di visualizzazione specificata con zeri, in modo da ricevere sempre un valore della lunghezza specificata. Questo è utile ad esempio per gli ID fattura.

Quindi, concludendo: la dimensione non è né bit né byte. È solo la larghezza del display, che viene utilizzata quando il campo ha specificato ZEROFILL.

mysql> create table a ( a tinyint );
Query OK, 0 rows affected (0.29 sec)
mysql> show columns from a;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| a | tinyint(4) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
1 row in set (0.26 sec)

mysql> alter table a change a a tinyint(1);
Query OK, 0 rows affected (0.09 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> insert into a values (100);
Query OK, 1 row affected (0.00 sec)

mysql> select * from a;
+-----+
| a |
+-----+
| 100 |
+-----+
1 row in set (0.00 sec)


2 Some code to better explain what I described so clumsily.
mysql> create table b ( b int (4));
Query OK, 0 rows affected (0.25 sec)

mysql> insert into b values (10000);
Query OK, 1 row affected (0.00 sec)

mysql> select * from b;
+-------+
| b |
+-------+
| 10000 |
+-------+
1 row in set (0.00 sec)

mysql> alter table b change b b int(11);
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0

mysql> select * from b;
+-------+
| b |
+-------+
| 10000 |
+-------+
1 row in set (0.00 sec)

mysql> alter table b change b b int(11) zerofill;
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0

mysql> select * from b;
+-------------+
| b |
+-------------+
| 00000010000 |
+-------------+
1 row in set (0.00 sec)

mysql> alter table b change b b int(4) zerofill;
Query OK, 1 row affected (0.08 sec)
Records: 1 Duplicates: 0 Warnings: 0

mysql> select * from b;
+-------+
| b |
+-------+
| 10000 |
+-------+
1 row in set (0.00 sec)

mysql> alter table b change b b int(6) zerofill;
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0

mysql> select * from b;
+--------+
| b |
+--------+
| 010000 |
+--------+
1 row in set (0.00 sec)

in realtà 3 c'è una larghezza di visualizzazione che funziona per ZEROFILL che si azzera a destra. Non limita la capacità del numero intero in quanto memorizza fino a 4294967295 partire da zero.

esempio,

CREATE TABLE tableName
(
    x INT(3) ZEROFILL NOT NULL, 
    y INT NOT NULL
);

INSERT INTO tableName (x,y) VALUES
(1, 1),
(12, 12);

SELECT x, y FROM tableName;

Risultato:

  x          y
001          1
012         12

L'uso della display width non ha alcun effetto sul modo in cui i dati vengono archiviati. Colpisce solo come viene visualizzato.







unsigned