Was ist der Vorteil von Zerofill in MySQL?


168

Ich möchte nur wissen, welchen Nutzen / welche Verwendung das Definieren ZEROFILLfür INTDataType in hat MySQL.

`id` INT UNSIGNED ZEROFILL NOT NULL 


Gute Frage. Verwandte Fragen, die auch gestellt werden könnten: Gibt es gute Gründe, ZEROFILL nicht zu verwenden? Was sind die Nachteile und möglichen Fallstricke bei der Verwendung von ZEROFILL? Wiegen die Vorteile die Nachteile auf?
Spencer7593

Antworten:


254

Wenn Sie eine Spalte mit Typ auswählen ZEROFILL, wird der angezeigte Wert des Felds mit Nullen bis zur in der Spaltendefinition angegebenen Anzeigebreite aufgefüllt. Werte, die länger als die Anzeigebreite sind, werden nicht abgeschnitten. Beachten Sie, dass die Verwendung von ZEROFILLauch impliziert UNSIGNED.

Die Verwendung ZEROFILLund eine Anzeigebreite haben keinen Einfluss darauf, wie die Daten gespeichert werden. Es wirkt sich nur darauf aus, wie es angezeigt wird.

Hier ist ein Beispiel für SQL, das die Verwendung von Folgendes demonstriert 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;

Ergebnis:

        x          y
 00000001          1
 00000012         12
 00000123        123
123456789  123456789

52
@diEcho: Wenn Sie beispielsweise möchten, dass alle Ihre Rechnungsnummern mit 10 Ziffern angezeigt werden, können Sie den Typ dieser Spalte als INT (10) ZEROFILL deklarieren.
Mark Byers

76
Ich empfehle Ihnen dringend, sich von dieser Funktion fernzuhalten. Wie ein numerischer Wert angezeigt / formatiert wird, ist ein Problem der Präsentation und absolut nichts, was auf Datenbankebene gehört. Zumindest nicht, wenn Sie die Datenbank zum Sichern einer Software verwenden. Beachten Sie, dass dies zu Problemen führen kann. Wenn Sie einen Wert mit einer führenden Null als Ganzzahl analysieren, betrachten viele Parser den Wert als oktal, was wahrscheinlich nicht das ist, was Sie wollen. Sie sollten diese Funktion nur als (Speicher-) Optimierung verwenden, wenn das, was Sie tatsächlich speichern, effektiv eine Ziffernfolge (fester Länge) ist.
mindplay.dk

3
@ mindplay.dk: Kommt darauf an. Wenn Sie so etwas wie eine GTIN speichern, müssen diese 14 Stellen lang sein, können aber auch nur 8 Stellen lang sein und mit Nullen links aufgefüllt werden. Sich auf die Ausgabeseite zu verlassen, wäre in diesem Fall nicht richtig, da es sich nicht nur um eine Dezimalstelle handelt, sondern um einen Schlüssel.
DanMan

1
@MarkByers, würden die meisten Client-Bibliotheken (z. B. PHP) in der Praxis nicht einfach die Nullen entfernen, bevor sie sie an den Anwendungscode übergeben? Wenn ja, dann scheint es wirklich etwas sinnlos. Ein schlechtes Design in den frühen Tagen von MySQL.
Pacerier

131

Ein Beispiel, um zu verstehen, wo die Verwendung von ZEROFILLinteressant sein könnte:

In Deutschland haben wir 5-stellige Postleitzahlen. Diese Codes können jedoch mit einer Null beginnen. Dies 80337ist eine gültige Postleitzahl für Munic.01067 eine Postleitzahl von Berlin.

Wie Sie sehen, erwartet jeder deutsche Staatsbürger, dass die Postleitzahlen als 5-stellige Code angezeigt werden 1067 sieht also seltsam aus.

Um diese Daten zu speichern, können Sie ein VARCHAR(5)oder verwenden, INT(5) ZEROFILLwährend die nullgefüllte Ganzzahl zwei große Vorteile hat:

  1. Viel weniger Speicherplatz auf der Festplatte
  2. Wenn Sie einfügen 1067, erhalten Sie immer noch 01067zurück

Vielleicht hilft dieses Beispiel beim Verständnis der Verwendung von ZEROFILL.


10
Es ist erwähnenswert, dass der SQL-Client , der die Daten anzeigt, für die Formatierung der Zahlen mit führenden Nullen verantwortlich ist. Dies geschieht nicht "automatisch", wenn jede einzelne Anwendung die Daten abruft.
a_horse_with_no_name

Spalten mit fester Breite sind ebenfalls besser, da sie die Fragmentierung auf der Festplatte verringern.
DanMan

@Phil, würden die meisten Client-Bibliotheken (z. B. PHP) in der Praxis nicht einfach die Nullen entfernen, bevor sie sie an den Anwendungscode übergeben? Wenn ja, dann scheint es wirklich etwas sinnlos. Ein schlechtes Design in den frühen Tagen von MySQL.
Pacerier

3
@Pacerier Dies hängt davon ab, wie die Daten in Ihrer Clientbibliothek dargestellt werden sollen: Als Nummer oder als Zeichenfolge. Eine deutsche Postleitzahl ist keine Zahl, sondern nur eine aus Ziffern bestehende Zeichenfolge. Daher stimme ich Ihrer Aussage über schlechtes Design in den frühen Tagen von MySQL nicht zu. Es ist immer noch ein gültiger Ansatz, aber für seltene Fälle.
Phil

61

Es ist eine Funktion für gestörte Persönlichkeiten, die quadratische Kästchen mögen.

Sie fügen ein

1
23
123 

Wenn Sie jedoch auswählen, werden die Werte aufgefüllt

000001
000023
000123

15

Es hilft bei der korrekten Sortierung, wenn Sie diese "Ganzzahl" mit etwas anderem (einer anderen Zahl oder einem anderen Text) verketten müssen, das dann als "Text" sortiert werden muss.

beispielsweise,

wenn Sie die Integer - Feld Zahlen verwenden müssen (sie 5 sagen) verketteten als A-005 oder 10/0005


4

Ich weiß, dass ich zu spät zur Party komme, aber ich finde, dass die Nullfüllung für boolesche Darstellungen von TINYINT (1) hilfreich ist. Null bedeutet nicht immer Falsch, manchmal möchte man es nicht. Indem Sie einen winzigen Wert auf Null setzen, konvertieren Sie diese Werte effektiv in INT und beseitigen alle Verwirrungen, die Ihre Anwendung bei der Interaktion haben kann. Ihre Anwendung kann diese Werte dann ähnlich wie den primitiven Datentyp True = Not (0) behandeln.


1
Danke, aber leider habe ich gerade einige Tests gegen eine MySQL-Datenbank durchgeführt und sie füllt keine Nullwerte aus: - /. Dieses Ziel wird immer noch erreicht, indem das Feld so eingeschränkt wird, dass keine Null zulässig ist. Ich sollte es besser wissen, als zu versuchen, Fragen zu DBS zu beantworten, die ich normalerweise nicht benutze. Ich werde meine Antwort löschen, bevor die Leute zu schlecht abstimmen. lol
Marlin

1
Nützlich? Es ist falsch. Zerofill macht nichts (außer Unsigned hinzufügen), wenn die Anzeigelänge 1 ist.
Brilliand

@Marlin und du solltest immer einen Standardwert für wahr oder falsch festlegen ... Wenn du keine Standardwerte verwendest, wird das von dir erwähnte Problem NICHT das einzige sein ... NICHT NULL ist auch ein Muss :)
Bakriawad

Ich würde abstimmen, aber Ihr Vertreter ist bei, 666also würde ich es vorziehen, diese Antwort so zu belassen, wie sie ist;-)
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

Wenn Sie ZEROFILL für eine numerische Spalte angeben, fügt MySQL der Spalte automatisch das Attribut UNSIGNED hinzu.

Numerische Datentypen, die das Attribut UNSIGNED zulassen, erlauben auch SIGNED. Diese Datentypen sind jedoch standardmäßig signiert, sodass das Attribut SIGNED keine Auswirkung hat.

Die obige Beschreibung stammt von der offiziellen MYSQL-Website.


0

NULLFÜLLEN

Dies bedeutet im Wesentlichen, dass, wenn der ganzzahlige Wert 23 in eine INT-Spalte mit der Breite 8 eingefügt wird, der Rest der verfügbaren Position automatisch mit Nullen aufgefüllt wird.

Daher

23

wird:

00000023
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.