Sql Veri Tipleri

Programlama dillerindeki değişkenler gibi veritabanları da benzer şekilde depolamak istediğimiz verileri çeşitli türlerde kategorize ederek saklar. Sql’de veri tipi veya veri türü (İngilizce – data type) olarak adlandırılır. Programlama dillerindekine benzer şekilde sayısal türler için int, metinsel ifadeler için varcahar gibi türler bulunmaktadır. Sql server veri tiplerini bu yazıda bunları isim-açıklama şeklinde yazmak yerine daha kapsamlı olarak hangi veritabanında yer verilmiş ve hangi sürümler kullanıyor gibi biraz daha detaylı olarak ifade etmeye çalışacağım.

Sayısal Veri Tipleri

int: int veri tipi en yaygın kullanılan birkaç türden biridir ve en çok kullanılan sayısal veri türü budur. Tamsayı türündeki verileri saklamak için kullanılır. 4 byte alan kaplar ve -2,147,483,648 ila 2,147,483,647 arasındaki tam sayıları saklayabilir. Genellikle Primary Key değerleri int olarak kullanılır.

tinyint: Bu değer 0 ila 255 arası tam sayıları depolar. 1 byte’lık alan kaplar ve C#’daki byte’ın karşılığıdır diyebiliriz. Genellikle yaş verisini, statüs durumları gibi değerleri saklamak için idealdir.

smallint: 32,768 ila 32,767 arası tam sayıları saklayabilir. 2 byte alan tutar. C#’daki değişken türleri olarak düşünecek olursak short tipinin karşılığıdır.

bigint: 9,223,372,036,854,775,808 ila 9,223,372,036,854,775,807 gibi oldukça büyük tam sayıları depolayabilir. 8 byte değerindedir ve C#’da long değişken tipine benzer.

bit: 0, 1, veya NULL değerlerini saklar. C# karşılığı bool (true – false) değişkenidir. 1 byte alan kaplar.

Decimal veri tipini doğru kullanmak

decimal: decimal (p(precision), s(scale)). Precision hassasiyet, scale ise ölçek anlamına gelir. Hem tamsayı hem ondalıklı sayıları saklamak için kullanılır. Parametredeki ilk değer decimal(18, 0) varsayılan 18 olan değer yani, virgülün hem solundaki hem sağındaki değerlerin toplamıdır. 1 ila 38 arasında değer alabilir. İkinci parametre ise, ondalık kısmı ölçeklendirmede kullanılır. Örnek verecek olursam;

Not ortalaması 88.15 olan bir öğrencinin değerini saklayacak bir tablo yapısı tasarlıyorsam şunu düşünürüm. Minimum ve maksimum değer. Öğrencilerin not ortalamaları 0-100 arasında bir değer alabilir ve genellikle ondalık kısın iki basamaklı olur yani maksimum 100.00 olabilir. Bunun decimal karşılığı decimal (5, 2)‘ dir. 2 virgülden sonraki basamak sayısını 5 ise virgülden önce + sonraki toplam basamak sayısını (saklanacak maksimum sayı) ifade eder.

Veritabanında ne kadar yer kapladığı toplam uzunluğa göre değişecektir. Aşağıda uzunluk – kapladığı alan olarak değerler verilmiştir.

  • 1 – 9 arası: 5 byte
  • 10 – 19 arası: 9 byte
  • 20 – 28 arası: 13 byte
  • 29 – 38 arası: 17 byte

money: -922,337,203,685,477.5808 ila 922,337,203,685,477.5807 arasında ki ondalık sayıları saklayabilir. Ondalık kısmın hassasiyeti 4 basamaktır. 8 byte alan tutar. C# ‘ta birebir karşılığı bulunmuyor ancak benzer parasal işlemleri decimal ile yapabilirsiniz.

smallmoney: -214,748.3648 ila 214,748.3647 arasında ki ondalık sayıları saklayabilir. Ondalık kısmın hassasiyeti 4 basamağa kadardır. 4 byte alan tutar. C# ‘ta birebir karşılığı bulunmuyor ancak benzer parasal işlemleri decimal ile yapabilirsiniz.

numeric: Microsoft’un dokümanlarında numeric ve decimal veri türleri birbirlerinin yerine kullanılabilmektedir. Tekrar örnek vermem gerekirse 12,345 sayısını decimal olarak saklamak istiyorsak minimum precision değerini 5, scale değerini de 3 yani decimal (5,3) olarak yapmamız gerekir. Veritabanında kapladığı alan decimal ile birebir aynıdır.

float: float (n) şeklinde parametre alır. 1-53 arası değer alabilir, belirtilmezse varsayılan değer 53’tür. Boyutu ve doğruluğu (ondalık kısımdaki duyarlılık) aldığı parametreye göre değişen ondalıklı sayılar için kullanılır.

  • 1 – 24 (7 hane) 4 byte
  • 25 – 53 (15 hane) 8 byte
GrupVeri türü adıDeğer AralığıKapladığı Alan
sayısalint-2,147,483,648 to 2,147,483,6474 byte
sayısaltinyint0 ila 2551 byte
sayısalbigint-9,223,372,036,854,775,808 ila 9,223,372,036,854,775,8078 byte
sayısalsmallint-32,768 ila 32,7672 byte
sayısaldecimal-10^38 ile +10^38değişken
sayısalnumeric-10^38 ile +10^38değişken
sayısalmoney-922,337,203,685,477.5808 ila 922,337,203,685,477.58078 byte
sayısalsmallmoney-214,748.3648 ila 214,748.36474 byte
sayısalfloatdeğişkendeğişken
Sql Veri Türleri kapladığı alan tablosu

Metinsel Veri Tipleri

char: char(n) şeklinde kullanılırlar. 8000 karaktere kadar unicode olmayan değerler saklanabilir. (n) parametresiyle belirtilenden daha az veri saklayabilir ancak sabit uzunluklu olduğundan eksik kalan uzunluk veritabanı tarafından boşluk ile doldurulacaktır. Bu sebeple tckn, telefon numarası, posta kodu gibi sabit uzunluklu verileri saklamak için idealdir. Char veri tipi hakkında daha çok daha detaylı bilgi edinmek istiyorsanız Char ve Varchar arasındaki farklar isimli yazıyı okuyabilirsiniz.

nchar: Char veri türünün Unicode karakterleri saklayabilen türüdür diyebiliriz. Tanımlanabilecek maksimum uzunluk 8000 yerine 4000’dir.

varchar: En fazla 8.000 karaktere kadar (unicode olmayan) depolama yapar. Chardan farklı olarak tanımlanan değerden daha kısa veriler saklandığında girilmeyen karakterleri boşlukla tamamlamaz. String türünde verileri saklamak için kullanılan en yaygın tiplerden biridir. Parametre olarak max alan versiyonu da bulunuyor ancak bundan farklı bir değişken olarak bahsedeceğiz.

nvarchar: Varchar veri tipinin unicode karakterleri de saklaması için düşünülmüş veri tipidir. Maksimum uzunluk yine 8000 yerine 4000’e düşer.

varchar(MAX): Bu veri tipinin depolama kapasitesi 8000 yerine 2 gigabyte’dır. 8000 byte ve altındaki uzunlukları in row olarak saklayabilirken 8000 byte’dan fazlasını out of row olarak saklar.

text: varchar(max) veri tipi ile benzerlik gösterse de Microsoft’un ifadesine göre Sql Server’ın gelecek sürümlerinde kaldırılacağı açıklanmış bir veri türüdür. Unicode olmayan karakterleri. En fazla 2GB’ye kadar depolama yapabilir. Varchar(max) ile çeşitli yönlerden farklıdır. İster 1 byte ister 2 gb veri girişi yapın iki durumda da out of row olarak saklama yapar. Out of row, in row depolama şekline göre daha verimsizdir. Text ve varchar max veri tipi arasındaki farklar bu yazıda daha detaylı anlatılmıştır.

ntext: text veri tipinin unicode için geliştirilen sürümüdür. Benzer özelliklere sahiptir.

Kullanmaktan kaçının: ntext, text ve image

Ntext, text ve image veri türleri SQL Server’ın gelecekteki bir sürümünde kaldırılacaktır. Bu veri türlerini yeni geliştirme çalışmalarında kullanmaktan kaçının ve halihazırda bunları kullanan uygulamaları değiştirmeyi planlayın. Bunun yerine nvarchar(max), varchar(max) ve varbinary(max) kullanın.

https://learn.microsoft.com/en-us/sql/t-sql/data-types/ntext-text-and-image-transact-sql?view=sql-server-2017
GrupVeri türü adıAçıklama
metinselvarcharn byte + 2 byte
metinselnvarchar(n byte + 2) * 2
metinselcharn byte
metinselncharn byte * 2
metinseltextn byte + 4 byte
metinselntextgirilen uzunluk * 2
metinselvarchar(MAX)n byte + 2 byte
metinselnvarchar(MAX)(n byte + 2) * 2
Sql metin bazlı veri tipleri değer kapasiteleri

Tarihsel Veri Tipleri

date: En yaygın kullanılan tarih saklama veri tiplerinden biridir. 3 byte uzunluğunda veri tipidir olan date, 0001-01-01 ile 9999-12-31 tarihleri arasındaki tüm değerleri saklayabilir. Default değeri 1900-01-01, default format ise YYYY-MM-DD’dir.

datetime: 1753-01-01 00:00:00.000 ile 9999-12-31 23:59:59.999 arası değerlerini saklar. YYYY-MM-DD hh:mm:ss:mmm şeklinde varsayılan formatı vardır ve 8 byte uzunluğunda en yaygın kullanılan tarihsel veri tipidir.

datetime2: Saklayabileceği değer aralıkları 0001-01-01 ile 9999-12-31 tarihleri arasında, zaman olarak da 00:00:00 ile 23:59:59.9999999 arasındadır. Datetime ile datetime2 arasındaki fark salise hassasiyetinin datetime2’de daha fazla olmasıdır. 7 basamağa kadar salise hassasiyeti saklanabilir. Kapladığı alan salise hassasiyetine göre 6-8 byte arası değişir. Tam değerler aşağıdaki gibidir.

  • 3’ten küçük hassasiyet için 6 byte gerekir.
  • 3 veya 4 hassasiyet için 7 byte.
  • 4’ten fazla hassasiyet 8 byte gerektirir.

smalldatetime: Zaman dahil tarih verilerini 4 byte uzunluğunda saklayan veri tipidir. Default format: YYYY-MM-DD hh:mm:ss saklayabileceği veri aralığı da 1900-01-01 00:00:00 ile 2079-06-06 23:59:59 arasıdır.

time: Sadece saat verilerini saklayan sql server veri türüdür. Default olarak hh:mm:ss:nnnnnnn formatında saklar. Dateteime2 gibi salise hassasiyeti maksimum 7 basamaklıdır ve kullanıcı tarafından değiştirilebilir olduğu için 3–5 byte arası yer kaplar.

datetimeoffset: Kullanım şekli ve veri aralığı datetime2 ile aynıdır. Datetime2 + saat dilimi kodu olarak düşünebiliriz. YYYY-MM-DD hh:mm:ss[.nnnnnnn] [{+|-}hh:mm] şeklinde default saklama şekli vardır. Tarih kısmı 0001-01-01 ile 9999-12-31 arası saat kısmı 00:00:00 ile 23:59:59.9999999 arası değer saklar. Örnek: 11.09.2023 20:30:15.1234567 +03:00

Saat dilimi -14:00 ila +14:00 arası değer alabilir. Uygulamalarınızda farklı zaman dilimlerini kullanan ülkelerin tarih verilerini saklıyorsak kullanışlıdır. datetimeoffset(n) şeklinde parametre alır. Default (sadece datetimeoffset olarak kullanırsak) parametre değeri 7’dir. Kapladığı alan ise parametreye göre değişkenlik gösterir;

  • 0 – 2 arası 8 byte
  • 3 – 4 arası 9 byte
  • 5 – 7 arası 10 byte
  • datetimeoffset (default 7) : 10 byte
GrupVeri türü adıKapladığı Alan
tarihseldate3 byte
tarihseldatetime8 byte
tarihseldatetime26 – 8 byte arası
tarihselsmalldatetime4 byte
tarihseltime3 – 5 byte arası
tarihseldatetimeoffset8 – 10 byte arası
Tarih ve zaman bazlı veri tipleri değer kapasiteleri

Diğer Veri Tipleri

sql_variant: İlginç ve fazla kullanılmayan bir veri tipidir. Girilen sütuna veri tipini bilmediğimizde veya aynı sütun alanına aynı zamanda sayısal, text bazlı, binary gibi farklı türde veri depolamak için kullanılır. Maksimum uzunluğu 8000 byte’tır.

sql_variant ile ilgili bilinmesi gereken şeylerden biri de veriyle işlem yapacağımız zaman (örneğin toplama işlemi) bu veri tipinin öncelikle uygun tipe dönüştürülmesi gerektiğidir. ODBC, sql_variant’ı tam olarak desteklemez. Microsoft OLE DB Provider ile bu veriye ulaştığımızda sütun içindeki değer binary data olarak bize döner.

xml: Adından da anlaşılacağı gibi xml türündeki verileri saklamak için kullanılan tiptir. Kapasitesi 2 GB’dır. Saklanan XML verisine göre varchar’daki gibi kapladığı yer değişkenlik gösterir.

geometry: Geometrik ifadelere ait koordinat açı değerleri için kullanılır.

timestamp: Tutulan kaydın versiyon numarası gibi düşünülebilir; biz bir tabloya kayıt eklediğimizde, güncellediğimizde her satır için farklı bir değer alır ve her güncellememizde bu değer değişir.

uniqueidentifier: Guid (Globally unique Identifier) tipinde veri tutar. Guid 16 byte boyutunda her üretildiğinde benzersiz olarak oluşan bir değerdir.

hierarchyid: Veriler arasında hiyerarşi olması gibi durumlarda kullanılmaktadır. Ancak genellikle ilişkili tablolar kullanılır bu tür işlemler için.

geography: Enlem boylam gibi coğrafi koordinatların değerleri saklamak için kullanılır.

Binary Veri Tipleri

binary: 8000 byte değerine kadar binary değer saklayan veri türüdür. (n) şeklinde parametre alır ve diskte kapladığı alan parametre kadardır yani sabit uzunluklu veri türüdür.

varbinary: 8000 byte değerine kadar binary değer saklayan veri türüdür. Değişken uzunlukta yani girdiğimiz veri kadar alan ayrılacaktır. Veri uzunluklarının değişken olduğu durumlarda kullanılması önerilir.

varbinary (max): 2 GB değerine kadar binary veri kaydedebilen sql veri tipidir. Varbinary – varbinary (max) ilişkisi varchar – varchar (max) ilişkisine benzemektedir.

image: Resim dosyalarını saklamak için oluşturulmuş sql server veri tipidir. 2 GB’a kadar veriler saklanabilir. İşlevsel olarak varbinary(MAX) ile aynıdır. Microsoft’un sayfasında bu veri türünün ileriki versiyonlarında kaldırılabileceği duyurulduğu için image yerine varbinary max önerilmektedir.

Sql Server Veri Tipi Ailesi

#İNGİLİZCE ADITÜRKÇE ADI
1Exact numericTam sayısal
2Approximate numericYaklaşık sayısal
3Date and timeTarih ve zaman
4Character stringsKarakter metin
5Unicode character stringsUnicode karakter metin
6Binary stringsBinary metin
7Other data typesDiğer data tipleri