VARCHAR'ın (255) bu kadar sık ​​kullanıldığını (başka bir uzunluğun aksine) görmem için iyi bir neden var mı?


158

Birden fazla ders, kitap ve işte, VARCHAR (255) olarak tanımlanan metin alanlarını "kısaltma" metni için varsayılan olarak gördüm. Güzel bir yuvarlak sayı olmaktan ziyade 255 uzunluğunun bu kadar sık ​​seçilmesinin iyi bir nedeni var mı ? Geçmişte, iyi bir nedenin (bugün geçerli olsun ya da olmasın) olduğu bir zaman ayırımı mı?

Tabii ki, eğer ipin maksimum uzunluğunu bir şekilde biliyorsanız, daha sıkı bir sınırın daha ideal olacağını anlıyorum. Ancak, muhtemelen maksimum uzunluğu bilmediğinizi gösteren VARCHAR (255) kullanıyorsanız, bu yalnızca bir "shortish" dizesidir.


Not: Bu soruyu (buldum varchar (255) v tinyblob v tinytext VARCHAR (diyor), n ) gerektirir n 1 için depolama bayt n <= 255, n için depolama 2 bayt n > 255. Tek sebep bu mu? Bu biraz keyfi görünüyor, çünkü VARCHAR'a (256) kıyasla sadece iki bayt tasarruf edersiniz ve VARCHAR (253) olarak başka bir iki baytı da kolayca kaydedebilirsiniz.

Yanıtlar:


109

Tarihsel olarak, 255 karakter genellikle VARCHARbazı DBMS'lerin maksimum uzunluğu olmuştur ve UTF-8 kullanmak ve sütunu dizine almak istiyorsanız (dizin uzunluğu sınırlamaları nedeniyle) bazen etkili maksimum olur.


4
@CharlesBretana: Alıntıladığınız cümlenin geri kalanını okuduğunuzda, istediğiniz tam açıklamayı bulacaksınız.
kaos

2
@CharlesBretana: "Sahte UTF-8" ile, MySQL'in "utf8" kodlamasını kastediyorum, bahsettiğim gibi karakter başına 3 bayt ayırır (ve bunlarla sınırlıdır). Bu UTF-8'in çok iyi bir sürümü değil; MySQL'de iyi bir UTF-8 istiyorsanız, "utf8mb4" kodlamasını kullanmanız gerekir. Ancak insanların bunu bilmeleri ve "utf8" ile gitmeleri çok daha olasıdır ve diğer kodlamalardan daha UTF-8 istemeleri daha olasıdır, bu nedenle, bir VARCHAR'da maksimum 255 karakterlik dizine sahip olabilirler. Buna rağmen hayretiniz.
kaos

3
@CharlesBretana: Şimdi üç kez açıkladım ve tek bir şey değişmedi. MySQL'in dizin uzunluğu sınırı hala 767 bayt, 3 baytlık UTF-8 karakterini kodlamak için gereken bayt sayısı hala 3 ve kat (767/3) hala 255. Dilencilerle ilgili kafanız karışacak bir şey bulma kararlılığınız .
kaos

1
@CharlesBretana (Bu partiye geç kaldığım için üzgünüm) DB uzmanı değilim, ama kaosun söylediği şey: evet 'Sahte UTF-8' sütunu 255 karakterden uzun olabilir, ancak dizin sadece varchar'ın ilk 255 karakteri üzerinde çalışarak tam olarak dizine eklenmesini istiyorsanız sütunu maksimum olarak etkin hale getirir. Şimdi sadece onun açıklamaları anladım, yanlış olabilir, ben hiç SQL dizinlerinde uzman değilim.
Francis Lord

2
@CharlesBretana Chaos'un cevabına düzgün bir şekilde bakarsanız, bunun 2 bölüme ayrıldığını fark edeceksiniz: 1. Varchar'ın (255) arkasındaki tarihsel neden bu kadar yaygın (bazı eski DBMS'lerde maksimum), 2. Bugün bile, daha önce tartışılan endeks sınırlamaları nedeniyle, bazıları için hala bir sınırlamadır, Bölüm 1 ve 2 bağlantılı değildir. Bölüm 1, sorunun asıl cevabıdır; bölüm 2, hala soruyla ilgili olan bir yan nottur, çünkü bugün bile neden hala bir sınırlama olabileceğini açıklamaktadır. (DEVAMI ->)
Francis Lord

161

255 kullanılır, çünkü 8 bitlik bir sayı ile sayılabilen en fazla karakterdir. 255 bit üzerindeki karakterleri saymak için başka bir tam bayt gerektirmeden, 8 bit sayımın kullanımını en üst düzeye çıkarır.

Bu şekilde kullanıldığında, VarChar metninizi saklamak için sadece bayt + 1 sayısını kullanır, bu nedenle alandaki karakter sayısı için sabit bir sınır (50 gibi) istemiyorsanız, 255 olarak da ayarlayabilirsiniz.


90
Bu ifadeyi beğendim: "anlamsızca başka bir bayt gerektiriyor". =)
MusiGenesis

7
Bu, varcharların UTF-8 olduğu DB'ler için geçerli midir?
antak

1
@antak: MySQL'de InnoDB kullanan herhangi bir anahtar sütun 767 bayttan büyük olamaz. Bir VARCHAR sütunu UTF8 ise (yani her karakter 3 bayta kadar sürebilir), sütunun izin verilen maksimum uzunluğu kat (767/3) = 255'tir. Tam da bu nedenle "767" seçildiğini varsayıyorum.
BlueRaja - Danny Pflughoeft

1
Charset iseutf8 , varchar(85)sınır olan geçiş devrilirse uzunluğu bayt bir iki bayt. Eğer öyleyse utf8mb4, öyle varchar(63). Bunlar önemlidir, çünkü çevrimiçi ALTER TABLE kullanılarak bir VARCHAR'ın uzunluğunun uzatılabileceği maksimum değerlerdir . Sonuç olarak, bu sayıları varchar(2) charset utf8sütunlu bir tablo oluşturarak ve verilen değeri ne kadar uzatabildiğimi görerek elde ettim ALGORITHM=INPLACE.
antak

Birçok "veritabanının" Back In The Day'in manyetik bantta saklandığını düşündüğünüzde daha da mantıklı. İkinin katları olarak boyutlandırılmış "bloklar" içindeki verileri okumak çok yaygındı. Bu şekilde, veriler en verimli şekilde depolandı (ve eski bir ana bilgisayarda çalışırken, bunun gibi küçük verimlilikler yap ya da kır optimizasyonlarıydı).
TMN

23

Muhtemelen hem SQL Server hem de Sybase (bildiğim iki isim için) bir VARCHARsütundaki karakter sayısı maksimum 255 karaktere sahip olduğundan . SQL Server için bu, 1996/1997 sürümündeki sürüm 7'de değişti ... ancak eski alışkanlıklar bazen zor ölüyor.


8
Belirli DB'leri ve Sürümleri belirtmek için +1. Ve "Eski alışkanlıklar sert ölür" muhtemelen en doğru cevaptır.
Andrew M

17

: Ben değişmezi soruyu cevaplamak için gidiyorum hayır , sen VARCHAR (255) (aslında var çoğu zaman kullanılan bakınız iyi bir sebep yoktur nedenleri diğer yanıtlar tartışıldığı gibi, sadece iyi olanlar değil). Mimar VARCHAR (255) yerine VARCHAR'ı (300) seçtiği için felaketle sonuçlanan birçok proje örneği bulamayacaksınız. Bu, VARCHAR yerine CHAR'dan bahsediyor olsanız bile, neredeyse tam bir önemsizlik meselesi olurdu.


255 üzerinden 1 bayt% 0.4'tür. Bazen son yarım yüzdeyi önemsiyorsunuz. Bazen bilmiyorsun. Eğer hosting ve perf maliyetleri onlarca dolar içine koşmak, muhtemelen umurumda değil. Milyonlarca insanla karşılaşırlarsa, muhtemelen yaparlar.
Edward Brey

2
@EdwardBrey: Moore Yasası hala geçerliyse, buradaki cevabım yazdığımdan 16 kat daha geçerli.
MusiGenesis

Bilgisayarların bize yardımcı olabileceği 16 kat daha fazla yol keşfetmedikçe. Hız hala bir özellik.
Edward Brey

14

Dediğinizde 2^8almak 256, ancak bilgisayarlar açısından numaralar numaradan başlar 0. Yani, sonra 255, IP için bir internet maskesinde veya IP'nin kendisinde sorgulayabilirsiniz.

255 8 bit tamsayının maksimum değeridir: 11111111 = 255

Bu yardımcı olur mu?


1
Tamsayılarla, 0'dan başlayarak sayıyorsunuz ve 255 ile bitiyorsunuz. Ancak bir dizedeki yerlerle 1. sıradan başlıyorsunuz, bu yüzden 256. sırada bitirmek mantıklı değil, çünkü 1 yerine 1'den başladınız 0? Ben string_length () sonuçları nedeniyle tamamen henüz varchar (256) ile aynı fikirde değilim, ama gerçekten emin değilim.
HoldOffHunger

1
Bir veritabanındaki @HoldOffHunger dizeleri sıfır karakter uzunluğuna sahip olabilir, bu nedenle uzunluk sekiz bitte saklandığında izin verilen uzunluk aralığı 0 ile 255 arasındadır. Dizelerin hepsinin en az bir karakter içermesi gerektiğini söylemek istiyorsanız, sekiz bit uzunluğunda 256 karakterli dizeleri destekleyebilir.
phoog

7

Not: Bu soruyu (buldum varchar (255) v tinyblob v tinytext VARCHAR (diyor), n ) gerektirir n 1 için depolama bayt n <= 255, n için depolama 2 bayt n > 255. Tek sebep bu mu? Bu biraz keyfi görünüyor, çünkü VARCHAR'a (256) kıyasla sadece iki bayt tasarruf edersiniz ve VARCHAR (253) olarak başka bir iki baytı da kolayca kaydedebilirsiniz.

Hayır. 253 bildirerek iki bayt kaydetmezsiniz. Varchar'ın uygulanması büyük olasılıkla bir uzunluk sayacı ve değişken uzunluklu, sonlandırılmamış bir dizidir. Bu, "merhaba" yı bir varchar (255) içinde saklarsanız 6 bayt işgal edeceğiniz anlamına gelir: uzunluk için bir bayt (5 sayısı) ve beş harf için 5 bayt.


3
Bu ifade tüm veritabanları için geçerli değildir. birçok veritabanı, tablolarda belirli bir boyuttaki varchar alanlarını kullanır, böylece bu alan bir satır için değiştirildiğinde satırları hareket ettirmek zorunda kalmazlar.
SingleNegationElimination

Evet haklısın. uygulamaya bağlıdır.
Durumun

2
Caiz olabilir ama uygulayıcı olabilir VARCHARbu şekilde bütün yendi noktasını kullanarak VARCHARyerine CHAR.
dan04

4

İşaretsiz 1 baytlık bir sayı [0-255] dahil olabilir. 255'i gördüğünüzde, bunun nedeni çoğunlukla programcıların10 (şaka olsun?) :)

Aslında, bir süredir 255, MySQL'de bir VARCHAR verebileceğiniz en büyük boyuttu ve VARCHAR'ı TEXT üzerinde dizinleme ve diğer sorunlarla kullanmanın avantajları var.


4

MsOffice (2000 veya 2002 sürümüne kadar) gibi birçok uygulamada, hücre başına maksimum karakter sayısı 255'tir. Alan başına 255 karakterden fazlasını işleyebilen programlardan bu uygulamalara veri taşımak bir kabustu. Şu anda, sınır giderek daha az engelliyor.


2

0000 0000 -> Bu 8 bitlik bir ikili sayıdır. Bir rakam biraz temsil eder.

Şu şekilde sayıyorsunuz:

0000 0000 → (0)

0000 0001 → (1)

0000 0010 → (2)

0000 0011 → (3)

Her bit iki değerden biri olabilir: açık veya kapalı. Toplam en yüksek sayı çarpma ile temsil edilebilir:

2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 - 1 = 255

Veya

2^8 - 1. 

İlk sayı 0 olduğu için birini çıkarırız.

255 oldukça az değer taşıyabilir.

Daha fazla bit kullandıkça, maksimum değer katlanarak artar. Bu nedenle, birçok amaç için, daha fazla bit eklemek aşırıdır.


1

Başka bir neden, RDO ve ADO (Windows sürümü ADO.NET değil) gibi çok eski veri erişim kitaplıklarında 255'ten fazla karakter içeren bir sütundan veri almak için özel bir yöntem olan GetChunk'i çağırmanız gerektiğidir. Bir varchar sütununu 255 ile sınırladıysanız, bu ekstra kod gerekli değildi.

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.