Metinveri türü ile
karakter değişken(
varchar`) veri türleri arasındaki fark nedir?
Belgelere]1 göre
Uzunluk belirteci olmadan karakter çeşitlemesi kullanılırsa, tür herhangi bir boyuttaki dizeleri kabul eder. İkincisi bir PostgreSQL uzantısıdır.
ve
Ayrıca PostgreSQL, herhangi bir uzunluktaki dizeleri depolayan metin türünü sağlar. Metin türü SQL standardında olmamasına rağmen, diğer bazı SQL veritabanı yönetim sistemleri de bu türe sahiptir.
Peki fark nedir?
Hiçbir fark yoktur, kaputun altında hepsi varlena
(değişken uzunluklu dizi).
Depesz'in bu makalesine göz atın: http://www.depesz.com/index.php/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text/
Öne çıkan birkaç şey:
Her şeyi özetlemek gerekirse:
char(n) -
n
den daha kısa değerlerle uğraşırken çok fazla yer kaplar (onların
ye tamponlar) ve sondaki değerlerin eklenmesi nedeniyle ince hatalara yol açabilir boşluklar, ayrıca sınırı değiştirmek sorunludur
- varchar(n) - canlı ortamda sınırı değiştirmek sorunludur (tabloyu değiştirirken özel kilit gerektirir)
- varchar - tıpkı metin gibi
- text - benim için bir kazanan - (n) veri türlerine göre çünkü onların sorunlarından yoksundur ve varchar'a göre - çünkü farklı bir adı vardır
Makale, 4 veri türünün tümü için ekleme ve seçme performansının benzer olduğunu göstermek için ayrıntılı testler yapmaktadır. Ayrıca, gerektiğinde uzunluğu kısıtlamanın alternatif yollarına ayrıntılı bir şekilde bakmaktadır. Fonksiyon tabanlı kısıtlamalar veya etki alanları, uzunluk kısıtlamasının anında artırılması avantajını sağlar ve bir dize uzunluğu kısıtlamasını azaltmanın nadir olduğu temelinde depesz, bunlardan birinin genellikle uzunluk sınırı için en iyi seçim olduğu sonucuna varır.
Belgelerdeki "Karakter Türleri" işaret ettiği gibi, varchar(n)
, char(n)
ve text
aynı şekilde saklanır. Tek fark, eğer bir uzunluk verilmişse, uzunluğu kontrol etmek için ekstra döngülere ihtiyaç duyulması ve char(n)
için dolgu gerekiyorsa ekstra alan ve zaman gerekmesidir.
Ancak, yalnızca tek bir karakter saklamanız gerektiğinde, "char"
özel türünü kullanmanın küçük bir performans avantajı vardır (çift tırnak işaretlerini koruyun - bunlar tür adının bir parçasıdır). Alana daha hızlı erişim elde edersiniz ve uzunluğu saklamak için ek yük yoktur.
Küçük harfli alfabeden seçilen 1.000.000 rastgele "char"
dan oluşan bir tablo yaptım. Frekans dağılımı elde etmek için yapılan bir sorgu (select count(*), field ... group by field
) yaklaşık 650 milisaniye sürerken, aynı veride text
alanı kullanarak yapılan sorgu yaklaşık 760 milisaniye sürüyor.
PostgreSQL kılavuzunda
Bu üç tip arasında, boş dolgulu tip kullanıldığında artan depolama alanı ve uzunluğu kısıtlı bir sütuna depolanırken uzunluğu kontrol etmek için fazladan birkaç CPU döngüsü dışında performans farkı yoktur. character(n) diğer bazı veritabanı sistemlerinde performans avantajlarına sahipken, PostgreSQL'de böyle bir avantaj yoktur; aslında character(n), ek depolama maliyetleri nedeniyle genellikle üçü arasında en yavaş olanıdır. Çoğu durumda bunun yerine metin veya karakter çeşitlemesi kullanılmalıdır.
Genellikle metin kullanırım
Referanslar: http://www.postgresql.org/docs/current/static/datatype-character.html