Jakie są zalety zerofill w MySQL?

168

Chcę tylko wiedzieć, jakie są korzyści / zastosowanie definiowania ZEROFILLdla INTDataType w MySQL?

`id` INT UNSIGNED ZEROFILL NOT NULL 
diEcho
źródło
Dobre pytanie. Powiązane pytania, które można również zadać: Czy istnieją dobre powody, aby nie używać ZEROFILL? Jakie są wady i potencjalne pułapki korzystania z ZEROFILL? Czy korzyści przeważają nad wadami?
spencer7593
Zobacz wyjaśnienie stackoverflow.com/questions/5634104/ ...
priyabagus

Odpowiedzi:

254

Po wybraniu kolumny za pomocą typu ZEROFILLwypełnia on wyświetlaną wartość pola zerami do szerokości wyświetlania określonej w definicji kolumny. Wartości dłuższe niż szerokość wyświetlania nie są obcinane. Zauważ, że użycie ZEROFILLrównież implikuje UNSIGNED.

Używanie ZEROFILLi szerokość wyświetlania nie ma wpływu na sposób przechowywania danych. Wpływa tylko na sposób wyświetlania.

Oto przykładowy SQL, który demonstruje użycie 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;

Wynik:

        x          y
 00000001          1
 00000012         12
 00000123        123
123456789  123456789
Mark Byers
źródło
52
@diEcho: Jeśli na przykład chcesz, aby wszystkie numery faktur były wyświetlane z 10 cyframi, możesz zadeklarować typ tej kolumny jako INT (10) ZEROFILL.
Mark Byers
76
Bardzo polecam trzymać się z daleka od tej funkcji - sposób wyświetlania / formatowania wartości liczbowej jest problemem prezentacji, a absolutnie nie jest czymś, co należy do poziomu bazy danych; przynajmniej nie, jeśli używasz bazy danych do tworzenia kopii zapasowych oprogramowania. Pamiętaj, że może to powodować problemy - jeśli przeanalizujesz wartość z wiodącym zerem jako liczbę całkowitą, wiele parserów uzna tę wartość za ósemkową, co prawdopodobnie nie jest tym, czego chcesz. Jedynym przypadkiem, w którym powinieneś używać tej funkcji, jest optymalizacja (przechowywania), kiedy to, co faktycznie przechowujesz, jest w rzeczywistości ciągiem cyfr (o stałej długości).
mindplay.dk
3
@ mindplay.dk: Zależy. Jeśli przechowujesz coś takiego jak numer GTIN, muszą one mieć 14 cyfr, ale mogą też składać się z zaledwie 8 cyfr i być wypełnione zerami po lewej stronie. Poleganie na stronie wyjściowej nie byłoby w tym przypadku właściwe, ponieważ nie jest to po prostu ułamek dziesiętny, ale klucz.
DanMan
1
@MarkByers. Praktycznie rzecz biorąc, czy większość bibliotek klienckich (np. PHP) nie usunęłaby po prostu zera przed przekazaniem jej do kodu aplikacji? Jeśli tak, to naprawdę wydaje się to bezcelowe. Zły projekt we wczesnych dniach MySQL.
Pacerier
131

Jeden przykład, aby zrozumieć, gdzie użycie ZEROFILLmoże być interesujące:

W Niemczech posiadamy 5-cyfrowe kody pocztowe. Jednak te kody mogą zaczynać się od zera, więc 80337jest to prawidłowy kod pocztowy dla miasta, 01067to kod pocztowy Berlina.

Jak widać, każdy obywatel Niemiec oczekuje, że kody pocztowe będą wyświetlane jako 5-cyfrowy kod, więc 1067wygląda to dziwnie.

Aby zapisać te dane, możesz użyć VARCHAR(5)lub, INT(5) ZEROFILLpodczas gdy liczba całkowita wypełniona zerami ma dwie duże zalety:

  1. Dużo mniej miejsca na dysku twardym
  2. Jeśli włożysz 1067, nadal 01067wrócisz

Być może ten przykład pomoże zrozumieć użycie ZEROFILL.

Phil
źródło
10
Warto dodać, że klient SQL wyświetlający dane odpowiada za formatowanie liczb z zerami na początku. Nie jest to coś, co dzieje się „automagicznie” z każdą aplikacją pobierającą dane.
a_horse_with_no_name
Kolumny o stałej szerokości są również lepsze, ponieważ zmniejszają fragmentację na dysku.
DanMan
@Phil. Praktycznie rzecz biorąc, czy większość bibliotek klienckich (np. PHP) nie usunęłaby po prostu zer, zanim przekaże ją do kodu aplikacji? Jeśli tak, to naprawdę wydaje się to bezcelowe. Zły projekt we wczesnych dniach MySQL.
Pacerier
3
@Pacerier Zależy to od tego, jak chcesz, aby dane w bibliotece klienta były reprezentowane: jako liczba lub jako ciąg. Niemiecki kod pocztowy nie jest liczbą, to ciąg składający się tylko z cyfr. Dlatego nie zgadzam się z twoim stwierdzeniem o złym projekcie we wczesnych dniach MySQL. To wciąż poprawne podejście, ale w rzadkich przypadkach.
Phil
61

To funkcja dla niespokojnych osobowości, które lubią kwadratowe pudełka.

Wstawiasz

1
23
123 

ale kiedy wybierzesz, wartości są wypełnione

000001
000023
000123
Elijah Saounkine
źródło
15

Pomaga w poprawnym sortowaniu w przypadku, gdy będziesz musiał połączyć tę „liczbę całkowitą” z czymś innym (inną liczbą lub tekstem), co będzie wymagało posortowania jako „tekst”.

na przykład,

jeśli będziesz musiał użyć liczb całkowitych pól (powiedzmy 5) połączonych jako A-005 lub 10/0005

Rozpoznać
źródło
4

Wiem, że spóźniłem się na imprezę, ale uważam, że zerofill jest pomocny w logicznych reprezentacjach TINYINT (1). Null nie zawsze oznacza fałsz, czasami nie chcesz. Wypełniając smallint, skutecznie konwertujesz te wartości na INT i usuniesz wszelkie niejasności, które aplikacja może mieć podczas interakcji. Twoja aplikacja może wtedy traktować te wartości w sposób podobny do pierwotnego typu danych True = Not (0)

Marlin
źródło
1
Dzięki, ale niestety właśnie przeprowadziłem kilka testów względem bazy danych mysql i nie zawiera zerofill wartości zerowych: - /. Ten cel jest nadal osiągany poprzez ograniczenie pola, aby nie dopuścić do wartości zerowej. Powinienem wiedzieć, że lepiej nie odpowiadać na pytania dotyczące dbs, których zwykle nie używam. Skasuję swoją odpowiedź, zanim ludzie będą zbyt zadowoleni. lol
Marlin
1
Przydatny? To jest niepoprawne. Zerofill nic nie robi (z wyjątkiem dodawania Unsigned), gdy długość wyświetlania wynosi 1.
Brilliand
@Marlin i zawsze powinieneś ustawiać domyślną wartość true lub false ... jeśli nie używasz wartości domyślnych, to problem, o którym wspomniałeś NIE będzie jedynym ... NOT NULL jest koniecznością :)
bakriawad
Głosowałbym przeciw, ale twój przedstawiciel jest na, 666więc wolałbym zachować tę odpowiedź bez zmian;-)
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)
zloctb
źródło
1

Jeśli określisz ZEROFILL dla kolumny numerycznej, MySQL automatycznie doda atrybut UNSIGNED do kolumny.

Liczbowe typy danych, które zezwalają na atrybut UNSIGNED, umożliwiają również PODPISANIE. Jednak te typy danych są domyślnie podpisane, więc atrybut SIGNED nie ma znaczenia.

Powyższy opis pochodzi z oficjalnej strony MYSQL.

Adeel
źródło
0

ZEROFILL

Zasadniczo oznacza to, że jeśli liczba całkowita 23 zostanie wstawiona do kolumny INT o szerokości 8, to reszta dostępnej pozycji zostanie automatycznie uzupełniona zerami.

W związku z tym

23

staje się:

00000023
Simon H.
źródło