Neden insanlar tarihsel olarak veritabanı alanı büyüklükleri için 256 değil 255 kullanıyor?


190

Genellikle veritabanı alanlarının 255 karakter büyüklüğüne ayarlandığını görürsünüz, bunun geleneksel / tarihi nedeni nedir? Sayfalama / bellek sınırları ve performansla ilgili bir şey olduğunu varsayıyorum, ancak 255 ile 256 arasındaki fark her zaman kafamı karıştırdı.

varchar(255)

Bu kapasite veya büyüklüğü göz önüne alındığında, bir dizin değil , niye 255 256 daha fazla tercih edilir? Bayt bir amaç için ayrıldı mı (sonlandırıcı veya null falan)?

Muhtemelen varchar (0) saçmalık (sıfır kapasiteye sahip)? Hangi durumda 2 ^ 8 alan mutlaka 256 olmalıdır?

Performans avantajları sağlayan başka büyüklükler var mı? Örneğin varchar (512), varchar (511) veya varchar (510) 'dan daha az performans mı gösteriyor?

Bu değer eski ve yeni tüm ilişkiler veritabanları için aynı mıdır?

Feragatname - Ben bir DBA değil geliştiriciyim, iş mantığımın bilindiği yere uygun alan boyutları ve türleri kullanıyorum, ancak bu tercihin tarihsel nedenini artık alakalı olmasa bile bilmek istiyorum (hatta hala alakalı ise daha fazla).

Düzenle:

Cevaplar için teşekkürler, bir baytın boyutu depolamak için kullanıldığı konusunda bir fikir birliği var gibi görünüyor, ancak bu konuyu tam olarak aklımda halletmiyor.

Meta veriler (dize uzunluğu) aynı bitişik bellekte / diskte saklanıyorsa, bir anlam ifade eder. 1 bayt meta veri ve 255 bayt dize verisi birbirine çok iyi uyuyor ve muhtemelen düzenli ve düzenli 256 bitişik depolama alanına sığacaktı.

Ancak ... Meta veriler (dize uzunluğu), gerçek dize verilerinden (belki de bir ana tabloda) ayrı olarak depolanırsa, yalnızca 1 baytlık bir tamsayıyı depolamak daha kolay olduğu için dize verilerinin uzunluğunu bir bayt ile sınırlamak için metadata biraz tuhaf görünüyor.

Her iki durumda da, muhtemelen DB uygulamasına bağlı bir incelik gibi görünmektedir. 255'i kullanma pratiği oldukça yaygın görünüyor, bu yüzden bir yerdeki biri başlangıçta bunun için iyi bir vaka tartışmış olmalı, herkes bu davanın ne olduğunu hatırlayabilir mi? Programcılar herhangi bir sebep olmadan yeni bir uygulama benimsemez ve bu bir kez yeni olmalıydı.


3
Çünkü karakter sayısı 0'dan N-1'e başlar. Yani 256 karakter varchar (255) olarak ilan edilecektir. Yanılmıyorsam.
Buhake Sindi

3
Belki BT insanları 1 ile değil, 0 ile saymaya başladığı için)?
Romain Linsolas

Eski okul programcılarıyla ilgili olduğunu düşünüyorum, neden yaptığımızı bile hatırlayamıyorum.
Huysuz

7
@Elite Gentleman: Hayır, parantez içindeki sayı gerçek uzunluktur ... C dizisi bildirimlerinde olduğu gibi: x [256] x [0] ... x [255] değerini verir.
RedPandaCurios

@romaintaz - ancak 1 öğe saklayabilecek bir dizi düşünün. Bir şey beyan edersiniz [1] ve bir şeye erişirsiniz [0]. Soru, SQL'de kapasitenin neden ilk bakışta mantıklı göründüğünden 1 bayt daha az olduğunu bildirmemizdir.
Andrew M

Yanıtlar:


167

En fazla 255 karakter uzunluğunda, DBMS alandaki verilerin uzunluğunu belirtmek için tek bir bayt kullanmayı seçebilir. Sınır 256 veya daha yüksek olsaydı, iki bayt gerekirdi.

Sıfır uzunluk değeri, varcharveriler için kesinlikle geçerlidir (aksi belirtilmedikçe). Çoğu sistem böyle boş bir dizeyi NULL'dan farklı olarak ele alır, ancak bazı sistemler (özellikle Oracle) boş bir dizeyi NULL ile aynı şekilde ele alır. Boş bir dizenin NULL olmadığı sistemlerde, değerin NULL olarak değerlendirilip değerlendirilmeyeceğini belirtmek için satırın herhangi bir yerinde ek bir bit gerekir.

Belirttiğiniz gibi, bu tarihsel bir optimizasyon ve muhtemelen bugün çoğu sistemle ilgili değil.


Uzunluk için bir bayt ayırmak mantıklıdır, ancak ikinci parametreniz için WRT, muhtemelen sıfır / değer / uzunluk sıfır geçerli, ancak / kapasite / uzunluk sıfır sıfır mı?
Andrew M

1
@Andrew: Ben sadece denedim ve PostgreSQL reddediyor varchar(0). Muhtemelen bu işe yaramaz çünkü değer sadece iki şey olabilir, boş dize veya NULL, ve böylece bunun bitiçin bir de kullanabilirsiniz .
Greg Hewgill

Dolayısıyla, kapasite meta verilerinin verinin kendisiyle aynı bitişik blokta saklandığını varsaymak doğrudur ve bu nedenle DB'nin bu iki şeyin (veri ve meta veri) toplamını bir sayfada (muhtemelen 256) tutması avantajı vardır bayt)?
Andrew M

@Andrew: Bu, söz konusu DBMS'nin uygulama ayrıntılarına bağlı olarak doğru olabilecek veya olmayabilecek bir varsayımdır. Sayfa boyutları genellikle 256 bayttan çok daha büyüktür. Bahsettiğim gibi, bu tür bir optimizasyon bazen önemlidir (örneğin milyarlarca küçük satır saklıyorsanız), ancak çoğu zaman endişelenmeye değmez.
Greg Hewgill

3
Disk alanı (ve dizin alanı) içindeki önem 256'nın bir sayfaya sığabileceği için değil, 1 bayt ve 2 bayt (milyon / milyar / trilyon satır için) büyük fark yarattığı için.
ypercubeᵀᴹ

35

255 mySQL4 ve önceki sürümlerde varchar limiti idi .

Ayrıca 255 karakter + Boş sonlandırıcı = 256

Veya 1 bayt uzunluk tanımlayıcısı olası bir aralık 0-255 karakter verir


Ve okuma char foo[256]önemlidir çünkü bellek yönetimi 2'nin gücünü sever. Bkz. Stackoverflow.com/questions/3190146/… Ayırma char foo[257], belleği parçalayacak veya 512 bayt alacaktır.
ebyrob

4
Varchar dizenin uzunluğunu saklamaz ve bu nedenle boş bir sonlandırıcıya ihtiyaç duymaz mı?
Cruncher

19

255, tek baytlık işaretsiz bir tamsayıda (8 bit bayt olduğu varsayılarak) saklanabilecek en büyük sayısal değerdir - bu nedenle, bir dizenin uzunluğunu bir amaçla saklayan uygulamalar 256'dan fazla 255'i tercih eder, çünkü sadece "size" değişkeni için 1 bayt ayırır.


17

MySQL Kılavuzundan:

Veri Türü:
VARCHAR (M), VARBINARY (M)

Depolama Gerekli:
Sütun değerleri 0 - 255 bayt gerektiriyorsa L + 1 bayt, değerler 255 bayttan fazla gerektirebilirse L + 2 bayt

Anlayın ve seçim yapın.


Evet, ama M represents the declared column length in characters for nonbinary string types and bytes for binary string types. L represents the actual length in bytes of a given string value. dev.mysql.com/doc/refman/5.7/en/storage-requirements.html
Platinum


7

Maksimum 255 uzunluğu, veritabanı motorunun her alanın uzunluğunu depolamak için yalnızca 1 bayt kullanmasını sağlar. 1 bayt boşluğun, dizenin uzunluğu için 2 ^ 8 = 256 farklı değer depolamanıza izin verdiğinden emin olursunuz.

Ancak, alanın sıfır uzunluklu metin dizelerini saklamasına izin verirseniz, uzunluğu sıfır olarak depolamanız gerekir. Böylece sıfırdan başlayarak 256 farklı uzunluk değerine izin verebilirsiniz: 0-255.


6

Genellikle varkarlar pascal dizeleri olarak uygulanır: gerçek uzunluğu bayt # 0'da tutmak. Bu nedenle uzunluk 255'e bağlandı. (Bayt değeri 0 ila 255 arasında değişir.)


5

<<

Bit / bayt depolamanın temellerini hatırladı, 256 ve 65536 arasındaki herhangi bir tamsayı için 256 ve tamsayıyı saklamak için bir bayt ve 511 veya 512 veya bu konu için 65535 depolamak için aynı alan (iki bayt) gerektirir. Bu nedenle, yukarıdaki tartışmada bahsedilen bu argümanın varchar (512) veya varchar (511) için N / A olduğu açıktır.


4

8 bit imzasız = 256 bayt

Uzunluk için 255 karakter + bayt 0


3

Eskiden tüm dizgilerin bir NUL sonlandırıcısı veya "ters eğik çizgi sıfır" ı olması gerekiyordu. Güncellenmiş veritabanlarında bu yoktur. Sonuna otomatik olarak "\ 0" eklenmiş olarak "255 karakterlik metin" idi, böylece sistem dizenin nerede bittiğini biliyordu. VARCHAR (256) derseniz, bu 257 olur ve bir karakter için bir sonraki kayıtta olurdunuz. Savurgan. Bu yüzden her şey VARCHAR (255) ve VARCHAR (31) idi. Alışkanlıktan 255 kişi sıkışmış gibi görünüyor ama 31'ler 32 ve 511'ler 512 oldu. Bu kısım tuhaf. Kendimi VARCHAR (256) yazmam zor.


0

Bunun sorunuza cevap verebileceğini düşünüyorum. Önceki sistemlerde maksimum varchar limiti olduğu anlaşılıyor. Başka bir yığın akışı sorusundan çıkardım.

En uzun posta adresinin ne olduğunu bilmek zor, elbette, bu yüzden birçok insan kesinlikle herhangi bir adresten daha uzun olan uzun bir VARCHAR seçiyor. Ve 255 gelenekseldir, çünkü zamanın başlangıcında bazı veritabanlarında VARCHAR'ın maksimum uzunluğu olabilir (daha yakın zamana kadar PostgreSQL'in yanı sıra).

Tüm metin tabanlı alanlar için genel bir varchar (255) kullanmanın dezavantajları var mı?


0

Veriler ikili sistemde belleğe kaydedilir ve 0 ve 1 ikili rakamlardır. 1 bayta (8 bit) sığabilecek en büyük ikili sayı, ondalık 255'e dönüştüren 11111111'dir.

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.