Apa manfaat zerofill di MySQL?

168

Saya hanya ingin tahu apa manfaat / penggunaan mendefinisikan ZEROFILLuntuk INTTipe Data MySQL?

`id` INT UNSIGNED ZEROFILL NOT NULL 
diEcho
sumber
Pertanyaan bagus. Pertanyaan terkait yang juga dapat ditanyakan: Apakah ada alasan bagus untuk tidak menggunakan ZEROFILL? Apa kelemahan dan potensi jebakan menggunakan ZEROFILL? Apakah manfaatnya lebih besar daripada kekurangannya?
spencer7593
Lihat penjelasan stackoverflow.com/questions/5634104/…
priyabagus

Jawaban:

254

Saat Anda memilih kolom dengan tipe, ZEROFILLitu mengaitkan nilai bidang yang ditampilkan dengan nol hingga lebar tampilan yang ditentukan dalam definisi kolom. Nilai yang lebih panjang dari lebar tampilan tidak terpotong. Perhatikan bahwa penggunaan ZEROFILLjuga menyiratkan UNSIGNED.

Penggunaan ZEROFILLdan lebar tampilan tidak berpengaruh pada bagaimana data disimpan. Itu hanya mempengaruhi bagaimana itu ditampilkan.

Berikut adalah beberapa contoh SQL yang menunjukkan penggunaan 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;

Hasil:

        x          y
 00000001          1
 00000012         12
 00000123        123
123456789  123456789
Mark Byers
sumber
52
@diEcho: Jika misalnya Anda ingin semua nomor faktur Anda ditampilkan dengan 10 digit maka Anda dapat mendeklarasikan jenis kolom itu sebagai INT (10) ZEROFILL.
Mark Byers
76
Saya sangat menyarankan Anda menjauh dari fitur ini - bagaimana nilai numerik ditampilkan / diformat adalah masalah presentasi, dan sama sekali bukan sesuatu yang berada di tingkat basis data; setidaknya tidak jika Anda menggunakan database untuk mendukung perangkat lunak. Ketahuilah bahwa ini dapat menyebabkan masalah - jika Anda menguraikan nilai dengan nol di depan sebagai bilangan bulat, banyak parser akan menganggap nilai tersebut sebagai oktal, yang mungkin bukan yang Anda inginkan. Satu-satunya waktu Anda harus menggunakan fitur ini, adalah sebagai optimasi (penyimpanan), ketika apa yang sebenarnya Anda simpan secara efektif adalah serangkaian digit (panjang tetap).
mindplay.dk
3
@ mindplay.dk: Tergantung. Jika Anda menyimpan sesuatu seperti GTIN, panjangnya harus 14 digit tetapi bisa juga hanya 8 digit dan kiri-empuk dengan nol. Mengandalkan sisi output tidak akan benar dalam kasus ini, karena itu bukan hanya desimal, tetapi kunci.
DanMan
1
@MarkByers, secara praktis, bukankah sebagian besar pustaka klien (mis. PHP) hanya menghapus angka nol sebelum mereka menyerahkannya ke kode aplikasi? Jika demikian, maka itu sepertinya benar-benar tidak ada artinya. Desain yang buruk di awal-awal MySQL.
Pacerier
131

Salah satu contoh untuk memahami, di mana penggunaan ZEROFILLmungkin menarik:

Di Jerman, kami memiliki kode pos 5 digit. Namun, Kode tersebut dapat dimulai dengan Nol, sehingga 80337kode pos yang valid untuk munic, 01067adalah kode pos Berlin.

Seperti yang Anda lihat, setiap warga negara Jerman mengharapkan kode pos ditampilkan sebagai kode 5 digit, jadi 1067terlihat aneh.

Untuk menyimpan data tersebut, Anda bisa menggunakan VARCHAR(5)atau INT(5) ZEROFILLsedangkan bilangan bulat zerofilled memiliki dua keuntungan besar:

  1. Banyak ruang penyimpanan yang lebih kecil pada hard disk
  2. Jika Anda memasukkan 1067, Anda masih mendapatkan 01067kembali

Mungkin contoh ini membantu memahami penggunaan ZEROFILL.

Phil
sumber
10
Perlu ditambahkan bahwa klien SQL yang menampilkan data bertanggung jawab untuk memformat angka dengan angka nol di depan. Ini bukan sesuatu yang "otomatis" terjadi dengan masing-masing dan setiap aplikasi tretrieving data.
a_horse_with_no_name
Kolom dengan lebar tetap juga lebih baik, karena mengurangi fragmentasi pada disk.
DanMan
@Phil, Secara praktis, bukankah sebagian besar pustaka klien (mis. PHP) hanya menghapus angka nol sebelum mereka menyerahkannya ke kode aplikasi? Jika demikian, maka itu sepertinya benar-benar tidak ada artinya. Desain yang buruk di awal-awal MySQL.
Pacerier
3
@Pacerier Ini tergantung pada bagaimana Anda ingin data di pustaka klien Anda diwakili: Sebagai angka atau sebagai string. Kode pos Jerman bukan angka, hanya string yang terdiri dari angka. Karena itu saya tidak setuju dengan pernyataan Anda tentang desain yang buruk di awal-awal MySQL. Ini masih merupakan pendekatan yang valid tetapi untuk kasus yang jarang terjadi.
Phil
61

Ini adalah fitur untuk kepribadian terganggu yang suka kotak persegi.

Anda memasukkan

1
23
123 

tetapi ketika Anda memilih, itu bantalan nilai

000001
000023
000123
Elijah Saounkine
sumber
15

Ini membantu dalam penyortiran yang benar jika Anda perlu menggabungkan "integer" ini dengan sesuatu yang lain (angka atau teks lain) yang perlu disortir sebagai "teks".

sebagai contoh,

jika Anda akan perlu menggunakan nomor bidang bilangan bulat (katakanlah 5) bersambung sebagai A-005 atau 10/0005

Ken
sumber
4

Saya tahu saya terlambat ke pesta tetapi saya menemukan bahwa zerofill sangat membantu untuk representasi boolean dari TINYINT (1). Null tidak selalu berarti False, terkadang Anda tidak menginginkannya. Dengan zerofilling sebuah tinyint, Anda secara efektif mengonversi nilai-nilai itu ke INT dan menghapus semua aplikasi yang mungkin Anda miliki saat berinteraksi. Aplikasi Anda kemudian dapat memperlakukan nilai-nilai itu dengan cara yang mirip dengan tipe data primitif True = Tidak (0)

Marlin
sumber
1
Terima kasih, tapi sayangnya saya hanya menjalankan beberapa tes terhadap mysql db dan tidak nol nilai nol: - /. Tujuan itu masih dicapai dengan membatasi bidang untuk tidak mengizinkan nol. Saya harus tahu lebih baik daripada mencoba dan menjawab pertanyaan tentang dbs yang biasanya tidak saya gunakan. Akan menghapus jawaban saya sebelum orang-orang terlalu downvote senang. lol
Marlin
1
Berguna? Itu salah. Zerofill tidak melakukan apa-apa (kecuali menambahkan Unsigned) ketika panjang tampilan adalah 1.
Brilliand
@Marlin dan Anda harus selalu menetapkan nilai default untuk benar atau salah ... jika Anda tidak menggunakan nilai default maka masalah yang Anda sebutkan TIDAK akan menjadi satu-satunya ... TIDAK NULL adalah suatu keharusan juga :)
bakriawad
Saya akan mengundurkan diri tetapi perwakilan Anda di 666jadi saya lebih suka untuk menjaga jawaban ini;-)
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
sumber
1

Jika Anda menentukan ZEROFILL untuk kolom angka, MySQL secara otomatis menambahkan atribut UNSIGNED ke kolom.

Tipe data numerik yang mengizinkan atribut TANDA TANGAN juga mengizinkan TANDA. Namun, tipe data ini ditandatangani secara default, sehingga atribut SIGNED tidak memiliki efek.

Deskripsi di atas diambil dari situs web resmi MYSQL.

Adeel
sumber
0

NOL

Ini pada dasarnya berarti bahwa jika nilai integer 23 dimasukkan ke dalam kolom INT dengan lebar 8 maka sisa posisi yang tersedia akan secara otomatis diisi dengan nol.

Karenanya

23

menjadi:

00000023
Simon H
sumber