Bir veritabanında metin sütunları üzerinden varchar kullanmak için herhangi bir sebep var mı?


36

varcharsadece bir kalıntı önce gelen textgeldi, yoksa olurdu durumlar kullanmak vardır istediğiniz bir kullanımı varchar? (Veya charbu konuda ..)

(Günlük Postgres ve MySQL (MyISAM) kullanıyorum, bu yüzden bunlar en çok ilgilendiğim şey, ancak diğer veritabanlarının cevapları elbette memnuniyetle karşılıyor. ^ _-)


6
İçin en az SQL Server , textkullanımdan kaldırılmıştır. Verilerin nerede saklandığı ve bu nedenle nasıl erişildiği ile ilgili kullanım kaygıları da vardır.
Oded

Bazı DBMS'lerde bir sıralama veya nerede yan tümcesinde bir metin sütunu kullanamayabilirsiniz. Postgres'e aşina değilim ama belgelerinizi kontrol edin.
jqa,

1
Bu StackOverflow sorusu biraz daha bilgi sağlayabilir.
J0ANMM

Yanıtlar:


32

Genel olarak

textsütunlar standart değildir ve uygulamaya özgüdür. : Birçok durumda, veritabanı bağlı aşağıdaki kısıtlamaların bir veya daha fazlasının bir arada var olabilir değiştirilebilir kesici değil , aranamaz ve sıralanabilir değil .

Postgreslerde

Tüm bu türler , aynı C veri yapısı kullanılarak dahili olarak kaydedilir. .

MySQL'de

textSütun özel bir versiyonudurBLOB ve endeksleme üzerinde kısıtlamalar vardır.

Sadece bu iki örnek diğer SQL RDBMS sistemlerine göre tahmin edilebilir ve bir türün ne zaman seçileceğini anlamak için yeterli neden olmalıdır.

Örtük olarak netleştirmek için, hiçbir zaman TEXTözel ve standart olmadığı için kullanmamalısınız . Buna SQLkarşı yazdığınız hiçbir şey taşınabilir olmayacak ve gelecekte sorunlara yol açacağı garanti edilecektir. Yalnızca ANSI Standardının bir parçası olan türleri kullanın .

  • CHARHer giriş için sabit sayıda karakteriniz olduğunu bildiğiniz zaman kullanın .
  • VARCHARHer giriş için değişken sayıda karakteriniz olduğunda kullanın .
  • Eğer daha fazla depolama alanına ihtiyaç duyarsanız VARCHAR, sağlayabilir CLOBile UTF-8kodlama veya eşdeğer standart tip.
  • ASLATEXT standart olmadığı için kullanmayın .

1
Kabul etmedim non standard and implementation specificve not indexable, not searchable and not sortablefarkında değildim. İzlenim altında ben text edildi standardize.
Izkata

1
ASCII textstandardı mı yoksa UNICODE textstandardı mı :-) veya diğer yarım düzine textkodlama standardından mı bahsediyorsunuz ?

1
SQL standartları belgelerini araştırmaya başlarsanız text, karakter tipi olarak bir şey bulacağınızı sanmıyorum . Hiçbir şey görmedim, bazı satıcılar buna long charbenzer isimler diyorlar , temelde buna eklenmiş bir kodlamaya sahip bir BLOB.

2
@JarrodRoberson dürüst olmak gerekirse, (Postgres ortamındayken) "her zaman kullandığı TEXT" sonucuna varılan saygın kaynaklar vardır . Eğer postgres' sınırsız olduğunu düşünmek gerekecek, özellikle de pek anlaşmayı bozar farklı bir veritabanına göç etmeye gidiyoruz VARCHARsınırsız çevirmek olmaz ve (nedeniyle tost gibi hiçbir satır sınırı var MySQL ile örneğin) VARCHARin Yine de diğer veritabanları.
Kayaman

1
... ve Postgres CLOB’yu desteklemediğinden , ikinci son nokta da geçerli değil. Standartlara uysanız bile , hiçbir zaman takma değiştirmeleri destekleyemezsiniz . Oyuncak SQL yazmıyorsanız, ANSI SQL yazmanın yanı sıra gerçek dünyada uygun bir seçenek değildir.
Kayaman

11

text, varcharVe chartüm farklı nedenlerle kullanılmaktadır. Elbette uygulama farklılıkları vardır (ne kadar yer kaplarlar .. vb.), Fakat aynı zamanda kullanım ve niyet konuları da vardır . Hangi tür kullandığınızı da içinde depolanacak verilerin türü hakkında bir şeyler söyler (ya da hepimiz her şeytext için kullanırız ). Bir şeyin sabit bir uzunluğu varsa, kullanırız . Değişken uzunluğu iyi tanımlanmış bir üst limite sahipse kullanın . Eğer üzerinde çok az kontrol sahibi olduğunuz büyük bir metin yığınıysa, muhtemelen en iyi bahsiniz olur.charvarchartext


3
Sooooooo, tek gerçek fark muhtemelen yine de program kodunda olması gereken sınırları kontrol etmektir.
Izkata

2
@ İzkata - Uygulama farklılıkları da var. Sınır kontrolü, veri türü hakkında değil . Bir (ABD) posta kodu her zaman 5 basamaklı bir koddur, bu nedenle 'char' gibi bir şey kullanmak bu veri tanımının bir parçası haline gelir. Hepimiz sadece için bir veri türünü kullanabilirsiniz kontrol sınırın gibi sadece şeyler olsaydı her şey ve bizim denetimi yapmak ve kod tarafını döküm.
System Down

6
Bildiğim @SystemDown Bildiğim kadarıyla, char, varcharve texthepsi aynı saklamak için tasarlanmıştır tip verilerin. Bu yüzden her iki cevap da sınırların kontrolü ile ilgili. Verimlilik farkları varsa, bunlar nedir? Neden kullanırsınız varcharüzerinde text?
Izkata

1
şamandıra ve çift de aynı veri türü için kullanılır, ancak farklılıkları vardır ve farklı kullanılırlar. Uygulama farklılıklarına gelince, Postgres'ten korktuğumu cevaplayacak kadar bilgi sahibi değilim.
System Down

4
@SystemDown Posta kodlarını bir karakter olarak saklamakla birlikte (5) eğer uluslararasılaşmaya başlarsanız sizi ısırır. İngiltere posta kodları uzunluğu değişir ve 5 karakter neredeyse hiçbir zaman yeterli değildir. İngiltere posta kodundaki boşluğun ayrıştırmayla ilgili olup olmadığını bilmiyorum.
Vatine

5

Veritabanları, performans - hızı ve depolamayı en aza indirgemekle yoğun bir şekilde ilgilenmektedir . Bilgisayar dünyasının diğer birçok yerinde, karakter dizginizde kaç karakter olduğu konusunda rahatsız olmayacaksınız; bir olabilir, bir ansiklopedi içeriğinin tamamı olabilir; hepsi sadece bir dize. Aslında, birçok dil sizi bir dize ya da sayı olup olmadığı konusunda rahatsız etmiyor bile.

Ancak bilgisayarlar hızlandıkça ve daha fazla bellek kazandıkça, insanlar veritabanlarına daha fazla veri koyar ve meraklı sorgular yapar. Bir veritabanı için CPU ve bellek, 64Kb ana bellek ve 10Mb sabit disk ( ana bilgisayarlarda) günlerinde olduğu gibi bugün de sınırlıdır .

Sabit bir bayt sayısı, değişken uzunluktaki bir sayıyla başa çıkmak için çok daha kolaydır. 10 bayt, 1.000.000'dan fazla işlemle daha kolaydır. Bu nedenle veritabanınız size bir ipucu vermenizi istiyor, böylece size mikrosaniye cinsinden terabayt veriden elde edilen sonuçları gigabayt verebilir. Veritabanınızı bu kadar zor kullanmıyorsanız, sunduğu hıza ihtiyacınız olmayacak ve gereksiz sorulara sinirleneceksiniz. Ancak performansa ihtiyacınız varsa, bazı ipuçları vermekten memnuniyet duyarsınız.

Diğer cevaplarda da belirtildiği gibi, charher zaman belirli sayıda karakter kullanıyorsa varcharkullanın, uzunluk değişebilir ancak çok büyük olmazsa kullanın ( tahminim çoğu DB'nin a charveya textboyutuna bağlı olarak davranması ) ve texteğer herhangi bir uzunlukta olabilir. SQL çalışır bir kullanımı ise textsütun, bir şekilde onu özetlemek ve bir koymak iyi olabilir charya da küçük varcharde sütuna, daha sonra yapılacak where'ın ve order by' bu konuda bu. Tabii ki, bu sadece performans sizin için önemliyse.

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.