MySQL'de sıfır dolgusunun faydası nedir?


168

Sadece DataType ZEROFILLiçin tanımlamanın yarar / kullanımı nedir bilmek istiyorum ?INTMySQL

`id` INT UNSIGNED ZEROFILL NOT NULL 


İyi soru. Ayrıca sorulabilecek ilgili sorular: ZEROFILL'i kullanmamak için iyi nedenler var mı? ZEROFILL kullanmanın sakıncaları ve potansiyel tuzakları nelerdir? Avantajlar dezavantajlardan daha ağır mı?
spencer7593

Yanıtlar:


254

Türü olan bir sütun seçtiğinizde ZEROFILL, alanın görüntülenen değerini sütun tanımında belirtilen ekran genişliğine kadar sıfırlarla doldurur. Ekran genişliğinden daha uzun değerler kesilmez. Kullanımının ZEROFILLda ima ettiğini unutmayın UNSIGNED.

ZEROFILLVe bir ekran genişliği kullanmanın verilerin nasıl depolanacağı üzerinde hiçbir etkisi yoktur. Yalnızca görüntülenme şeklini etkiler.

İşte kullanımını gösteren bazı örnek SQL 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;

Sonuç:

        x          y
 00000001          1
 00000012         12
 00000123        123
123456789  123456789

52
@diEcho: Örneğin, tüm fatura numaralarınızın 10 basamakla görüntülenmesini istiyorsanız, bu sütunun türünü INT (10) ZEROFILL olarak bildirebilirsiniz.
Mark Byers

76
Bu özellikten uzak durmanızı tavsiye ederim - sayısal bir değerin nasıl gösterildiği / biçimlendirildiği bir sunum endişesidir ve kesinlikle veritabanı düzeyinde olan bir şey değildir; en azından bir yazılım parçasını yedeklemek için veritabanını kullanıyorsanız. Bunun sorunlara neden olabileceğini unutmayın; baştaki sıfır ile bir tamsayı olarak bir değeri ayrıştırırsanız, birçok ayrıştırıcı değeri sekizli olarak kabul eder, bu muhtemelen istediğiniz şey değildir. Bu özelliği kullanmanız gereken tek zaman, gerçekte depoladığınız şeyin etkili bir şekilde (sabit uzunluklu) bir sayı dizisi olduğu bir (depolama) optimizasyonu gibidir.
mindplay.dk

3
@ mindplay.dk: Bağlıdır. GTIN gibi bir şey saklıyorsanız, bunların 14 basamak uzunluğunda olması gerekir, ancak sadece 8 basamaklı olabilir ve sıfırlarla sol dolgulu olabilir. Çıktı tarafına güvenmek bu durumda doğru olmaz, çünkü bu sadece bir ondalık değil, bir anahtardır.
DanMan

1
@MarkByers, Pratik olarak konuşursak, çoğu istemci kütüphanesi (örneğin PHP) uygulama koduna teslim etmeden önce sıfırları kaldırmaz mı? Eğer öyleyse, o zaman gerçekten anlamsız görünüyor. MySQL'in ilk günlerinde kötü bir tasarım.
Pacerier

131

Kullanımının ZEROFILLilginç olabileceğini anlamak için bir örnek :

Almanya'da 5 haneli posta kodlarımız var. Bununla birlikte, bu Kodlar Sıfır ile başlayabilir, bu nedenle 80337üniforma için geçerli 01067bir posta kodu, Berlin'in bir posta kodu.

Gördüğünüz gibi, herhangi bir Alman vatandaşı posta kodlarının 5 haneli bir kod olarak görüntülenmesini bekliyor, bu yüzden 1067garip görünüyor.

Bu verileri saklamak için a VARCHAR(5)veya INT(5) ZEROFILLsıfır kullanabilirsiniz, ancak sıfır dolu tamsayı iki büyük avantaja sahiptir:

  1. Sabit diskte çok daha az depolama alanı
  2. Yerleştirirseniz 1067, yine de 01067geri dönersiniz

Belki bu örnek, kullanımının anlaşılmasına yardımcı olur ZEROFILL.


10
Verileri gösteren SQL istemcisinin sayıları baştaki sıfırlarla biçimlendirmekten sorumlu olduğunu eklemeye değer . Bu, verileri işleyen her uygulamada "otomatik olarak" gerçekleşen bir şey değildir.
a_horse_with_no_name

Sabit genişlik sütunları da daha iyidir, çünkü disk üzerinde parçalanmayı azaltırlar.
DanMan

@Phil, Pratik olarak konuşursak, çoğu istemci kütüphanesi (örneğin PHP) uygulama koduna teslim etmeden önce sıfırları kaldırmaz mı? Eğer öyleyse, o zaman gerçekten anlamsız görünüyor. MySQL'in ilk günlerinde kötü bir tasarım.
Pacerier

3
@Pacerier Bu, istemci kitaplığınızdaki verilerin nasıl gösterilmesini istediğinize bağlıdır: Sayı olarak veya dize olarak. Alman posta kodu bir sayı değil, yalnızca rakamlardan oluşan bir dizedir. Bu nedenle, MySQL'in ilk günlerinde kötü tasarım beyanınıza katılmıyorum. Hala geçerli bir yaklaşım ama nadir durumlar için.
Phil

61

Kare kutuları seven rahatsız kişilikler için bir özellik.

Siz ekleyin

1
23
123 

ancak seçtiğinizde, değerleri doldurur

000001
000023
000123

15

Bu "tamsayıyı" daha sonra "metin" olarak sıralanması gereken başka bir şeyle (başka bir sayı veya metin) birleştirmeniz gerektiğinde doğru sıralamaya yardımcı olur .

Örneğin,

A-005 veya 10/0005 olarak birleştirilmiş tam sayı alan numaralarını (diyelim 5) kullanmanız gerekecekse


4

Partiye geç kaldığımı biliyorum ama sıfır dolgunun TINYINT'in (1) boole gösterimleri için yararlı olduğunu düşünüyorum. Null her zaman Yanlış anlamına gelmez, bazen istemezsiniz. Bir tinyint'i sıfır doldurarak, bu değerleri etkili bir şekilde INT'ye dönüştürürsünüz ve uygulamanın etkileşimi üzerine gelebilecek karışıklıkları ortadan kaldırırsınız. Daha sonra uygulamanız bu değerleri ilkel veri tipine benzer bir şekilde işleyebilir True = Not (0)


1
Teşekkürler, ama ne yazık ki ben sadece bir mysql db karşı bazı testler koştu ve sıfır değerleri doldurmak yok: - /. Bu hedefe hala alanın null değerine izin vermeyecek şekilde kısıtlanarak ulaşılmaktadır. Ben genellikle kullanmıyorum dbs hakkında soruları denemek ve cevap daha iyi bilmeli. İnsanlar çok mutlu olmadan önce cevabımı silerim. lol
Marlin

1
Kullanışlı? Yanlış. Ekran uzunluğu 1 olduğunda sıfır doldurma hiçbir şey yapmaz (İmzasız ekle hariç)
Brilliand

@Marlin ve her zaman doğru veya yanlış için varsayılan bir değer ayarlamanız gerekir ... varsayılan değerleri kullanmazsanız, bahsettiğiniz sorun sadece bir tane DEĞİLDİR ... NULL DEĞİL de bir zorunluluktur :)
bakriawad

Ben aşağı iterdim ama temsilciniz 666bu yüzden bu yanıtı olduğu gibi tutmayı tercih ederim;-)
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

Sayısal bir sütun için ZEROFILL belirtirseniz, MySQL otomatik olarak UNSIGNED özniteliğini sütuna ekler.

UNSIGNED özniteliğine izin veren sayısal veri türleri de SIGNED'e izin verir. Ancak, bu veri türleri varsayılan olarak imzalanmıştır, bu nedenle SIGNED özniteliğinin bir etkisi yoktur.

Yukarıdaki açıklama MYSQL resmi web sitesinden alınmıştır.


0

zerofill

Bu, esasen 23 tamsayı değeri 8 genişliğine sahip bir INT sütununa eklenirse, mevcut konumun geri kalanının otomatik olarak sıfırlarla doldurulacağı anlamına gelir.

bundan dolayı

23

dönüşür:

00000023
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.