Qual è il vantaggio di zerofill in MySQL?


168

Voglio solo sapere qual è il vantaggio / utilizzo della definizione ZEROFILLdi INTDataType MySQL?

`id` INT UNSIGNED ZEROFILL NOT NULL 


Buona domanda. Domande correlate che potrebbero anche essere poste: ci sono buoni motivi per non usare ZEROFILL? Quali sono gli svantaggi e le potenziali insidie ​​dell'utilizzo di ZEROFILL? I benefici superano gli svantaggi?
spencer7593,

Risposte:


254

Quando si seleziona una colonna con tipo ZEROFILL, il valore visualizzato del campo viene riempito con zeri fino alla larghezza di visualizzazione specificata nella definizione della colonna. I valori più lunghi della larghezza del display non vengono troncati. Si noti che l'utilizzo di ZEROFILLimplica anche UNSIGNED.

L'uso ZEROFILLe la larghezza di visualizzazione non influiscono sul modo in cui i dati vengono archiviati. Influisce solo su come viene visualizzato.

Ecco alcuni esempi di SQL che dimostrano l'uso di ZEROFILL:

CREATE TABLE yourtable (x INT(8) ZEROFILL NOT NULL, y INT(8) NOT NULL);
INSERT INTO yourtable (x,y) VALUES
(1, 1),
(12, 12),
(123, 123),
(123456789, 123456789);
SELECT x, y FROM yourtable;

Risultato:

        x          y
 00000001          1
 00000012         12
 00000123        123
123456789  123456789

52
@diEcho: Se ad esempio vuoi che tutti i tuoi numeri di fattura vengano visualizzati con 10 cifre, puoi dichiarare il tipo di quella colonna come INT (10) ZEROFILL.
Mark Byers,

76
Consiglio vivamente di stare alla larga da questa funzione: il modo in cui un valore numerico viene visualizzato / formattato è un problema di presentazione e assolutamente non qualcosa che appartiene a livello di database; almeno non se si utilizza il database per eseguire il backup di un software. Tenere presente che ciò può causare problemi: se si analizza un valore con uno zero iniziale come un numero intero, molti parser considereranno il valore come ottale, che probabilmente non è quello che si desidera. L'unica volta che dovresti usare questa funzione, è come un'ottimizzazione (di archiviazione), quando ciò che stai effettivamente memorizzando è effettivamente una stringa di cifre (a lunghezza fissa).
mindplay.dk,

3
@ mindplay.dk: dipende. Se stai memorizzando qualcosa di simile a un GTIN, devono essere lunghi 14 cifre ma possono anche essere solo 8 cifre e riempiti a sinistra con zeri. Affidarsi al lato output non sarebbe giusto in questo caso, perché non è semplicemente un decimale, ma una chiave.
DanMan,

1
@MarkByers, in pratica però, la maggior parte delle librerie client (ad esempio PHP) non eliminerebbe semplicemente gli zeri prima di consegnarli al codice dell'applicazione? Se è così, allora sembra davvero un po 'inutile. Un cattivo design ai primi tempi di MySQL.
Pacerier,

131

Un esempio per capire, dove l'uso di ZEROFILLpotrebbe essere interessante:

In Germania, abbiamo codici postali a 5 cifre. Tuttavia, questi codici possono iniziare con uno zero, quindi 80337è un codice postale valido per la tunica, 01067è un codice postale di Berlino.

Come vedi, qualsiasi cittadino tedesco si aspetta che i codici postali vengano visualizzati come un codice di 5 cifre, quindi 1067sembra strano.

Per archiviare questi dati, è possibile utilizzare un VARCHAR(5)o INT(5) ZEROFILLmentre l'intero zerofilled presenta due grandi vantaggi:

  1. Molto meno spazio di archiviazione sul disco rigido
  2. Se si inserisce 1067, si 01067torna ancora indietro

Forse questo esempio aiuta a capire l'uso di ZEROFILL.


10
Vale la pena aggiungere che il client SQL che visualizza i dati è responsabile della formattazione dei numeri con zeri iniziali. Questo non è qualcosa che "automagicamente" accade con ogni singola applicazione che recupera i dati.
a_horse_with_no_name

Anche le colonne a larghezza fissa sono migliori, perché riducono la frammentazione su disco.
DanMan,

@Phil, in pratica però, la maggior parte delle librerie client (ad es. PHP) non eliminerebbe semplicemente gli zeri prima di consegnarli al codice dell'applicazione? Se è così, allora sembra davvero un po 'inutile. Un cattivo design ai primi tempi di MySQL.
Pacerier,

3
@Pacerier Dipende da come si vogliono rappresentare i dati nella libreria del client: come numero o come stringa. Un codice postale tedesco non è un numero, è solo una stringa composta da cifre. Pertanto non sono d'accordo con la tua affermazione di cattiva progettazione nei primi giorni di MySQL. È ancora un approccio valido ma per rari casi.
Phil

61

È una caratteristica per le personalità disturbate che amano le scatole quadrate.

Si inserisce

1
23
123 

ma quando lo selezioni, riempie i valori

000001
000023
000123

15

Aiuta nel corretto ordinamento nel caso in cui sia necessario concatenare questo "numero intero" con qualcos'altro (un altro numero o testo) che dovrà essere ordinato come "testo".

per esempio,

se è necessario utilizzare i numeri dei campi interi (diciamo 5) concatenati come A-005 o 10/0005


4

So di essere in ritardo alla festa ma trovo che zerofill sia utile per le rappresentazioni booleane di TINYINT (1). Null non significa sempre False, a volte non lo vuoi. Zerofillando un minuscolo, stai effettivamente convertendo quei valori in INT e rimuovendo qualsiasi confusione che l'applicazione potrebbe avere durante l'interazione. L'applicazione può quindi trattare tali valori in modo simile al tipo di dati primitivo True = Not (0)


1
Grazie, ma sfortunatamente ho appena eseguito alcuni test su un mysql db e non riempie i valori null: - /. Tale obiettivo viene comunque raggiunto limitando il campo a non consentire null. Dovrei sapere meglio che cercare di rispondere a domande su dbs che di solito non uso. Eliminerò la mia risposta prima che le persone diventino troppo felici. lol
Marlin,

1
Utile? Non è corretto. Zerofill non fa nulla (tranne aggiungere Unsigned) quando la lunghezza del display è 1.
Brilliand

@Marlin e dovresti sempre impostare un valore predefinito su true o false ... se non usi valori predefiniti, il problema che hai citato NON sarà l'unico ... NOT NULL è un must :)
Bakriawad,

Vorrei sottovalutare, ma il tuo rappresentante è a, 666quindi preferirei mantenere questa risposta così com'è;-)
Martin

3
mysql> CREATE TABLE tin3(id int PRIMARY KEY,val TINYINT(10) ZEROFILL);
Query OK, 0 rows affected (0.04 sec)

mysql> INSERT INTO tin3 VALUES(1,12),(2,7),(4,101);
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM tin3;
+----+------------+
| id | val        |
+----+------------+
|  1 | 0000000012 |
|  2 | 0000000007 |
|  4 | 0000000101 |
+----+------------+
3 rows in set (0.00 sec)

mysql>

mysql> SELECT LENGTH(val) FROM tin3 WHERE id=2;
+-------------+
| LENGTH(val) |
+-------------+
|          10 |
+-------------+
1 row in set (0.01 sec)


mysql> SELECT val+1 FROM tin3 WHERE id=2;
+-------+
| val+1 |
+-------+
|     8 |
+-------+
1 row in set (0.00 sec)


1

Se si specifica ZEROFILL per una colonna numerica, MySQL aggiunge automaticamente l'attributo UNSIGNED alla colonna.

Anche i tipi di dati numerici che consentono l'attributo UNSIGNED consentono SIGNED. Tuttavia, questi tipi di dati sono firmati per impostazione predefinita, quindi l'attributo SIGNED non ha alcun effetto.

La descrizione sopra è tratta dal sito ufficiale di MYSQL.


0

ZEROFILL

Ciò significa essenzialmente che se il valore intero 23 viene inserito in una colonna INT con la larghezza di 8, il resto della posizione disponibile verrà automaticamente riempito con zeri.

Quindi

23

diventa:

00000023
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.