CHAR, VARCHAR veya VARCHAR(MAX) Arasındaki Farklar Nedir?

Bu yazıda CHAR, VARCHAR ve VARCHAR(MAX) arasındaki farkları elimden geldiğince açıklamaya çalıştım. Hangi durumlarda hangisini seçeceğimizi ve karşılaşacağımız avantaj ve dezavantajları belirlemeye çalıştım.

CHAR, VARCHAR ve VARCHAR(MAX) veri türleri, karakter verilerini saklayabilir. Bu yazıda, bu üç farklı karakter veri türünün arasındaki farkları ve birbirlerine üstünlüklerini ifade etmeye çalışacağım. Umarım bu bilgiler bu veri türlerini ne zaman kullanmanın uygun olduğuna karar vermenize yardımcı olacaktır.

CHAR sabit uzunluklu karakter veri tipi

CHAR veri tipi, sabit uzunluktaki verileri saklamak için düşünülmüştür. Karakterleri, sayıları ve özel karakterleri 8000 bayta kadar saklayabilir. CHAR veri türü genellikle sabit uzunlukta olan tckn, telefon, posta kodu gibi verileri saklamak için idealdir. Uzunluğun büyük ölçüde değişkenlik gösterdiği alanlar için (adres, notlar gibi) CHAR iyi bir seçim olmayacaktır.

CHAR veri tipi değişken uzunlukta verileri elbette kabul edecektir ancak tanımladığımız boyuttan depolanan karakterlerin uzunluğu çıkarılarak eksik haneler boşluk karakteriyle doldurulur. Yani bunu yaparak herhangi bir tasarruf sağlamamış oluruz çünkü boşluk eklenerek tamamen doldurulduğu için her satır aynı miktarda disk alanı veya bellek kullanır. Sonradan eklenen boşluklar bu alanı kullanmamızı zorlaştırır. Arama yaptığınızı veya diğer karakter alanlarıyla birleştirdiğinizi düşünün 🙂

VARCHAR değişken uzunluklu karakter veri türü

VARCHAR veri tipi, değişken uzunluklu verileri depolarken kullanılır. Karakterleri, sayıları ve özel karakterleri char sütunu gibi saklayabilir ve 8000 byte’a kadar olan uzunluğu destekler. Varchar veri tipinin kapladığı alan bizim ona insert edeceğimiz karakter miktarıyla doğru orantılıdır. Char’ın aksine kalan uzunluğu doldurmak için boşluk eklenmez. Bu nedenle, VARCHAR veri tipi boyutları büyük ölçüde değişen veriyi depolamak için idealdir.

Sql Server Varchar veri tipi sütununu okurken ve yazarken uzunluğu da hesaplanması ve kullanması gerektiğinden CHAR’a nazaran biraz daha az performanslı olduğu kabul edilir. Buna rağmen yalnızca insert edildiği kadar alanı kullandıklarını düşündüğümüzde disk alanından tasarruf etmek için çoğu durumda bu performans artışı göz ardı edilebilir.

CHAR ve VARCHAR veri türleri arasındaki farklar

CHAR ve VARCHAR arasındaki temel fark, CHAR veri tipinin uzunluğunun sabit olması, VARCHAR veri tipinin ise değişken uzunluklu veri sütunlarını desteklemesidir. Ama aynı zamanda benzerler. Her ikisi de alfasayısal verileri depolayabilir. Bu iki veri türü arasındaki farkları daha iyi anlamak için aşağıdaki tabloda bulunan benzerlikleri ve farklılıkları gözden geçirin.

CHARVARCHAR
Sabit boyutlu dizileri depolamak için kullanılır.Değişken uzunluktaki dizileri depolamak için kullanılır.
1 ila 8000 bayt arasında boyut aralığında olabilir.1 ila 8000 bayt arasında boyut aralığında olabilir.
Sütunun boyutuna bağlı olarak sabit miktarda depolama alanı kullanır.Depolanan dizenin boyutuna göre değişen miktarlarda depolama alanı kullanır.
Collation ayarına bağlı olarak her karakter için 1 ila 4 bayt yer kaplar.Collation ayarlarına bağlı olarak her karakter için 1 ila 4 bayt yer kaplar ve verilerin uzunluğunu depolamak için bir veya daha fazla bayt gerektirir.
Daha iyi performansUzunluğun hesaba katılması gerektiğinden biraz daha düşük performans.
Sabit boyutlu uzunluktan daha kısa dizeleri saklarken boşlukları sağa doğru doldurur.Boyut olarak değişken olduğu için dolgu gerekmez.
CHAR ve VARCHAR arasındaki farklar

CHAR (N) veya VARCHAR (N)’deki “N” ne anlama gelir?

Sql Server, Latince gibi bazı karakter gruplarını her karakteri bir byte olacak şekilde depolar. Ancak Japonca gibi karakterleri saklamak için birden daha fazla byte alanına ihtiyaç duyar.

CHAR ve VARCHAR veri tipleri 8000 byte’a kadar depolayabilir. Single-byte bir karakter seti kullanılıyorsa bir CHAR veya VARCHAR sütununda en fazla 8000 karakter saklanabilir. Multi-byte collation kullanılıyorsa, VARCHAR veya CHAR’ın saklayabileceği maksimum karakter sayısı 8000’den az olacaktır.

Truncation Error Nedir?

Sql Server’da CHAR (6) veya VARCHAR (6) bu iki değişken tipi bu şekilde tanımlandığında, 6 sayısı maksimum depolanabilecek byte sayısını temsil eder. CHAR (6) veya VARCHAR (6) alanına daha uzun bir insert yapılırken aşağıdaki gibi Truncation Error meydana gelebilir.

Truncation Error Nedir
Truncation Error Nedir?

Bu hata, bir CHAR veya VARCHAR sütununun maksimum uzunluğundan daha uzun bir veriyi depolamaya çalışırken oluşur. Bunun gibi bir Truncation error oluştuğunda, TSQL kodu sona erer ve aşağıdaki kodlar yürütülmez. Bu hataya örnek olması açısından aşağıdaki kod kullanılarak Truncation error hatası alınması sağlanabilir.

CREATE TABLE #MyTempTable (isim VARCHAR(6));
INSERT INTO #MyTempTable VALUES ('Hüseyin');

SELECT * FROM #MyTempTable;

DROP TABLE #MyTempTable

Yukarıdaki kod, INSERT deyimi yürütüldüğünde üst resimdeki hatayı verir. INSERT deyimini izleyen SELECT deyimi ise truncation error hatası nedeniyle kodun çalışması durduğundan işletilmez. Truncation error hatası sonrası oluşan betik sonlanma sql kodunuz için yanlış bir şey olduğunda kodun devamında da yanlış gitmesini engelleyebilir. Ancak bu durumun oluşabileceği yerlerde uzunluk kontrolü yapılmasında fayda var. Aksi halde truncation error oluşarak kodunuzu sonlandırması ihtimali vardır..

VARCHAR ve VARCHAR (MAX) arasındaki fark nedir?

VARCHAR(MAX) veri türü, değişken uzunluklu karakter verilerini desteklemesi açısından VARCHAR veri türüne benzer. VARCHAR(MAX), en fazla 2 GB (2.147.483.647 bayt) uzunluğundaki karakter dizilerini destekleyebilir. Varchar’dan en büyük farklı budur ve bir değerin boyutu 8000 byte’ı aşabileceğinde düşünülmelidir.

Neden VARCHAR kullanmak yerine neden her zaman VARCHAR(MAX) kullanmıyoruz?

  • VARCHAR(MAX) veri tipi, index key column desteklemez.
  • VARCHAR(MAX) veri tipi, alanın uzunluğunu kısıtlamanıza izin vermez.
  • VARCHAR(MAX), büyük bir uzunluk depolarken LOB_DATA ayırma birimlerini kullanır. LOB_DATA depolaması, IN_ROW_DATA depolama ayırma birimlerine göre çok daha yavaştır.
  • LOB_DATA depolaması, sayfa ve satır sıkıştırmayı desteklemez.

VARCHAR(MAX) sql veri tipini kullanırken 2.147.483.647 byte’ı aşmazsak yukarıdaki truncation error hatasını ortadan kaldıracağını düşünebiliriz. 2.147.483.647 byte’ı geçersek de aşağıdaki hatayı alırız.

truncation error hatası nedir?
Boyutu 2 GB’tan uzun olduğunda oluşan hata

Yani varchar (max) depolayacağımız veriler 8000 byte’dan uzunsa ve 2 GB’ı geçmiyorsa dezavantajlarını göz önünde bulundurarak kullanmamız gereken bir veri tipidir.

CHAR, VARCHAR ve VARCHAR (MAX) Hangisini Tercih Etmeliyim?

CHAR sütunlarının boyutu sabittir, VARCHAR ve VARCHAR(MAX) sütunları ise değişken uzunluklu verileri destekler. Uzunluğu çok az değişen sütunlar için CHAR sütunları kullanılmalıdır. Uzunluğu önemli ölçüde değişen ve 8.000 baytı aşmayan dize değerleri bir VARCHAR sütununda saklanmalıdır. Çok büyük dizeleriniz varsa (8.000 bayttan fazla), VARCHAR(MAX) kullanılmalıdır. VARCHAR sütunlarını saklamak için, verilerle birlikte uzunluk bilgisi de saklanır. Bir VARCHAR sütunu için uzunluk değerinin hesaplanması ve saklanması, SQL Server’ın CHAR sütunu veri türleri üzerinden VARCHAR sütunlarını depolamak ve almak için biraz daha fazla iş yapması gerektiği anlamına gelir.

  • Tüm dize değerleri aynı boyuta yakın mı saklanacak? Cevap evet ise, o zaman bir CHAR kullanmalısınız.
  • Depolanacak dizelerin boyutu büyük ölçüde değişiyorsa ve değerlerin tümü 8.000 bayta eşit veya daha küçükse, VARCHAR’ı kullanın.
  • Çok büyük dizeleriniz varsa (8.000 bayttan fazla), VARCHAR(MAX) kullanılmalıdır.

VARCHAR ve CHAR arasındaki performans değerlendirmesi

Veritabanı motorunun VARCHAR sütunlarını depolamak ve almak için gerçekleştirmesi gereken iş miktarı, bir CHAR sütunu için gerekenden daha fazladır. VARCHAR sütunu her alındığında, Sql Server varchar sütun değeri almak için verilerle birlikte depolanan uzunluk bilgisine de ihtiyaç duyar. Bu da fazladan CPU kullanılması demektir. Oysa bir CHAR sütunu (sabit uzunluk), SQL Server’ın sabit uzunluklu olduğu için CHAR veri tipini daha kolay ve hızlı getirmesini sağlar.

CHAR ve VARCHAR sütunlarıyla uğraşırken disk alanı da dikkate alınması gereken bir konudur. CHAR sütunları sabit uzunlukta olduğundan her zaman aynı miktarda disk alanını kaplayacaktır bu ölçeklendirmede daha belirleyicidir. VARCHAR sütunlarının ise boyutu sakladığı karakter sayısına göre değişir bu nedenle kapladığı alan parantezler içinde tanımlanan boyut yerine depolanan karakter uzunluğuna bağlıdır.

Eğer saklamak istediğiniz veri, tanımlayacağınız uzunlukta char tipinden genellikle daha küçük olacaksa varchar kullanmak daha disk alanı kaplayacaktır. Daha az disk alanı ise sütun verisini eklerken ve getirirken daha az I/O gerektireceğinden bu daha iyi performans anlamına gelebilir. Yani saklayacağınız uzunluğa göre CHAR ve VARCHAR arasında akıllıca seçim yapılmalıdır.