T-SQL - Metinsel Veri Tiplerinin Karşılaştırılması (varchar, nvarchar, char, nchar)

Bu yazımda; T-SQL'de bulunan fakat kullanım ve farklılıkları sıklıkla karıştırılan metinsel veri tipleri (varchar, nvarchar, char, nchar), örneklerle ifade edilecektir.

Aşağıdaki sorular üzerinden tek tek irdelenecektir. Örnekler sırasında, T-SQL fonksiyonları olarak DATALENGTH (metnin byte cinsinden uzunluğu) ve  LEN(metnin karakter uzunluğu) fonksiyonları kullanılacaktır. 

Metinsel veri tiplerin temel özelliklerine değinecek olursak;

  • Bu tiplerin başında başlayan n ibaresi (national character) ulusal dilde (Arapça, Japonca) ifadeler tanımlayabileceğimiz Unicode karakterler anlamına gelir. Ayrıca tanımlanan uzunluğun 2 katı kadar bellekte yer ayrılır.
  • char veri tipi, fixed length - sabit uzunlukludur. 50 karakter tanımladığımız kolon için, bellekte 50 karakter uzunlukta alan ayrılır. Uzunluğu en fazla 50 olacak şekilde ne girersek girelim bellekte 50 birim uzunlukta yer kaplar.
  • varchar veri tipi, variable length - değişken uzunlukludur. 50 karakter tanımladığımız kolon için, uzunluğu en fazla 50 olacak şekilde girilen metnin uzunluğu kadar yer kaplar.

Karşılaştırmadan önce; örnekte kullanılan tablo tanımlama SQL scripti aşağıdaki gibidir. Metinsel bütün tipler yer almaktadır.

nvarchar ile nchar arasındaki fark

Oluşturduğumuz tablodan yapılan aşağıdaki sorgular sırasıyla nvarchar ve nchar tiplerini tutan kolonlar listelenmiştir. Uluslararası bir karakter olarak Arapça bir kelime kaydedildi. 50 karakter uzunluğundaki veri tiplerimizde uzunluğu 5 karakter olan içerik için bellekte aşağıdaki sayıda alan ayrılmıştır. 

nvarchar - 10

nchar - 100 

10 ve 100 olmasının sebebi, Unicode karakter tutulduğu için 2 katı alan ayrılmasındandır.


nvarchar ile varchar arasındaki fark

Oluşturduğumuz tablodan yapılan aşağıdaki sorgular sırasıyla nvarchar ve varchar tipleri tutan kolonlar listelenmiştir. varchar kolonumuz için ????? değeri gelmesinin sebebi, Unicode karakter tutulamadığı için dönüştürme yapılamadı fakat bellekte alan ayrılmıştır. nvarchar için problemsiz görünüyor. Uzunluğu 5 karakter olan içerik için bellekte aşağıdaki sayıda alan ayrılmıştır. 

nvarchar - 10 

10 olmasının sebebi, değişken uzunlukta olup ayrıca Unicode karakter tutulduğu için 2 katı alan ayrılmasındandır.

varchar - 5 

5 olmasının sebebi, varchar veri tipinin değişken uzunlukta olmasındandır.


char ile varchar arasındaki fark

Oluşturduğumuz tablodan yapılan aşağıdaki sorgular sırasıyla char ve varchar tipleri tutan kolonlar listelenmiştir. İki veri tipi için de ????? değeri gelmesinin sebebi, Unicode karakter tutulamadığı için dönüştürme yapılamadı fakat bellekte alan ayrılmıştır. Uzunluğu 5 karakter olan içerik için bellekte aşağıdaki sayıda alan ayrılmıştır. 

varchar - 5

5 olmasının sebebi, varchar veri tipinin değişken uzunluğunda olmasındandır.

char - 50 

50 olmasının sebebi, char veri tipinin sabit uzunlukta olmasındandır.


nchar ile varchar arasındaki fark

Oluşturduğumuz tablodan yapılan aşağıdaki sorgular sırasıyla nchar ve varchar tipleri tutan kolonlar listelenmiştir. varchar veri tipi için ????? değeri gelmesinin sebebi, Unicode karakter tutulamadığı için dönüştürme yapılamadı fakat bellekte alan ayrılmıştır. nchar için problemsiz görünüyor. Uzunluğu 5 karakter olan içerik için bellekte aşağıdaki sayıda alan ayrılmıştır. 

varchar - 5

5 olmasının sebebi, varchar veri tipinin değişken uzunluğunda olmasındandır.

nchar - 100

100 olmasının sebebi, char veri tipinin sabit uzunlukta olup ayrıca Unicode karakter tutulduğu için 2 katı alan ayrılmasındandır.


Örnekler sonrası hangisi tercih edilmeli noktasında aşağıdaki konular ışığında tercihlerinizi yapabilirsiniz. 

  • Tablonuzda Çince, Arapça gibi uluslararası karakter tutmak isterseniz; nvarchar ile nchar veri tiplerini arasında seçim yapılmalıdır.
  • Performans bakımından düşünülecekse; char, varchara göre daha performanslıdır. Sebebi; char veri tipinin ayrılmış olduğu alan sabit olduğu için güncelleme yapılacak bir veri varsa bellekte ayrılmış olan alana yazar. varchar, değişken uzunlukta olduğu için bellek ayırma işlemi ile beraber güncelleme işlemi de yapar. 
  • Bellek ayırma konusu dikkat edilecekse varchar tercih edilmelidir.

nvarchar(MAX) ve varchar(MAX) tiplerinde MAX olarak belirtilen uzunluk tanımlaması, verinin uzunluğunu öngöremediğimiz durumlarda işe yarar ve esneklik sağlar. Gerçek hayatta xml verisi veya açıklama metni tutarken kullanılabilir. Fakat uzunluğu belli bir sınırı aşmayacağını öngördüğümüz zaman MAX yerine metinsel içeriğin alabileceği maksimum uzunluk değeri verilmelidir.

Özetle; T-SQL'deki metinsel veri tiplerini örnek sorgular üzerinde kullanımlarını karşılaştırarak hangi durumlarda tercih edilebileceğini belirttim. 

Keyifli ve faydalı olmasını umarak, çalışmalarınızda kolaylıklar diliyorum...

Yorumlar