SQL Server Veri Tipleri

Bu yazımızda Sql veri tiplerinin özellikleri ve kullanım alanlarından bahsedeceğiz. Veritabanı içerisinde tablolar oluşturulurken, depolanacak her veri için, en ideal veri tipinin belirlenmesi gerekir. Sebebi performansı etkilediği içindir. Küçük uygulamalarda göze çarpmasada büyük uygulamalarda veri tiplerini doğru şekilde belirlemiş olmak, verilerin disk alanında daha az yer kaplamasını, verileri daha seri çekmesini sağlar yani performansa olumlu…

April 3, 2023 by Aryasoft IT

Bu yazımızda Sql veri tiplerinin özellikleri ve kullanım alanlarından bahsedeceğiz. Veritabanı içerisinde tablolar oluşturulurken, depolanacak her veri için, en ideal veri tipinin belirlenmesi gerekir. Sebebi performansı etkilediği içindir. Küçük uygulamalarda göze çarpmasada büyük uygulamalarda veri tiplerini doğru şekilde belirlemiş olmak, verilerin disk alanında daha az yer kaplamasını, verileri daha seri çekmesini sağlar yani performansa olumlu yönde katkıda bulunur. Veri tabanımızı oluştururken veri tiplerini doğru seçmek bizim için çok önemlidir. Veri tabanımızın performansını etkileyebilecek önemli konulardan birisidir. Şimdi sırasıyla kullanabileceğimiz veri tiplerinin neler olduğunu inceleyelim:

Eğer amacınız veri tabanı geliştirme ve yönetimi ise, veri türleri kategorilerindeki benzerlik ve farklılıkları not etmek ve stored procedure’ler için tür ve dizayn parametreleri oluştururken depolama alanınızı buna göre planlamak isteyebilirsiniz.

 

1) Metinsel Veri Tipleri

char: Unicode’u desteklemeyip char(n) şeklinde kullanılırlar. 8000 karaktere kadar değer alabilirler. Belirtilenden(n) az karakter girilse dahi giriş yapılan boyut kadar yer kaplar. Veri giriş boyutları benzer, sabit olan veri kümelerinde kullanılması önerilir

nchar: Unicode(uluslararası karakter setini, tanımlı tüm alfabeleri içerir.)destekler. Chardan farklı olarak maksimum 4000 karaktere kadar değer alabilir.

varchar: Chardan farklı olarak verinin boyutu kadar yere kaplar. 8000 karaktere kadar depolama yapar. Birbirinden farklı uzunlukta veri girişi yapılacağı zaman kullanılması önerilir. Varchar (MAX) kullanımı ile 2GB’a kadar depolama yapılabilir.

nvarchar: Verinin boyutu kadar yer kaplar. Varchardan farklı olarak unicode’u destekler.4000 karaktere kadar değer alabilir.

text: Belirtilenden az değer girilse bile boyutu kadar yer kaplar.2GB’a kadar metinsel veri depolar. Unicode’u desteklemez.

ntext: Text’den farklı olarak girilen karakter boyutu kadar yer kaplar ve unicode’u destekler.

!NOT: Microsoft, Text ve Ntext veri türlerini performans kaybı yaşanma ihtimalinden dolayı kullanmayı önermiyor.

2) Binary (ikilik) Veri Tipleri

Binary string veri türleri, bir geliştiricinin serileştirilmiş dosya, byte stream’ler ve diğer özel veriler gibi binary bilgileri depolamasına izin verir. Binary veri türü, sayısal ve karakter dizisi veri türleriyle karşılaştırıldığında aralık ve depolama gereksinimlerindeki farklılıkları vardır. Sabit ve değişken uzunlukta binary string verilerinin her ikisini de kullanabilirsiniz. Bunlar arasındaki farklar ilerleyen bölümlerde yer alan karakter veri türü bölümünde açıklanacaktır.

Binary: 1 ve 0 ları temsil eden ikilik taban veri tipidir. Sabit uzunluklu veri tiplerinde kullanılırlar.8000 byte’a kadar depolama yapabilir.

Varbinary: Binary’den farklı olarak girilen karakter kadar yer kaplar. Bu yüzden uzunlukların değişken olduğu durumlarda tercih edilir.

Image: Resim dosyalarını saklamak için kullanılır. En fazla 2 GB’a kadar veri depolar. Bunun yerine varbinary(MAX) kullanılması tercih edilir.

!Not: Image veri türü de bir binary string veri türüdür ancak SQL Server’ın gelecekteki bir sürümünde kaldırılacaktır. Bunun yerine varbinary(max) kullanılmalıdır.

 

3) Sayısal Veri Tipleri       

Sayısal veri türleri exact numeric and approximate numeric olmak üzere iki alt kategoriden birine girer.

  • Exact numeric veri türleri:
    • Integer veri tipleri: Tamsayı veri türleri (tinyint, smallint, int, bigint) arasındaki fark, kapasiteleri ve depolama gereksinimleridir. Örneğin, tinyint veri türü 1 baytlık depolama maliyeti ile 0 ila 255 arasındaki değerleri tutabilir. Buna karşılık, bigint veri türü -2^63 (-9,223,372,036,854,775,808) ile 2^63-1 (9,223,372,036,854,775,807) arasında 8 bayt veri tutabilir.
    • Decimal veri türleri: Bu veri türleri, saklanacak toplam basamak sayısı (kesinlik) ve ondalık basamağın sağındaki basamak sayısı (ölçek) ile belirtilir. Hassasiyet ne kadar büyük olursa, depolama maliyeti de o kadar yüksek olur. Ondalık(decimal) veri türü ile sayısal(integer) veri türü arasında işlevsel bir fark olmadığını unutmayın. Ondalık, ISO standartlarına uygun bir isimdir; integer ise SQL Server’ın önceki sürümleriyle geriye dönük uyumluluk için kullanılmaktadır.
    • Parasal veri türleri: Dört ondalık basamağa kadar ölçekle parasal değerleri depolamak için veri türü. Integer veri türlerinde olduğu gibi, money ile smallmoney arasındaki fark, kapasiteleri ve depolama gereksinimleridir. Smallmoney veri tipi -214.748.3648 ile 214.748.3647 arasındaki değerleri 4 bayt depolama maliyetiyle tutar. Money veri tipi -922.337.203.685.477.5808 ile 922.337.203.685.477.5807 arasındaki değerleri 8 bayt depolama maliyetiyle tutar.
    • Boolean veri türü: Bit veri türü, SQL Server tarafından sayısal değerler olarak işlenen Boolean değerlerini (true / false) depolamak için kullanılır; true için 1 ve false için 0.
  • Approximate numeric veri türleri: Bu veri türlerinin kesinliği daha azdır, ancak exact numeric veri türlerinden daha fazla kapasiteye sahiptir. Değerleri hassasiyet eksikliği nedeniyle doğruluğu kaybeden bilimsel notasyon içerisinde saklar.
    • Float: Float veri türünde float sayısının mantisini bilimsel gösterim şeklinde saklamak için kullanılan isteğe bağlı olarak bit sayısı parametre şeklinde alır. Mantis değerinin büyüklüğü float verisinin depolama boyutunu belirler. Mantis 1 ila 24 arasındaysa, şamandıra 4 bayt gerektirir. Mantis 25 ila 53 arasındaysa, 8 bayt gerektirir.

Bit: Bir byte uzunluğunda tam sayı veri tipidir. Genellikle evet/hayır şeklinde mantıksal bilgileri tutmak için kullanılır.

Int: 4 byte büyüklüğünde, -2 milyar /+2 milyar arasında değer tutabilen tam sayı veri tipidir.

Bigint: 8 byte büyüklüğünde -2⁶³ ve 2⁶³ arasında değer tutabilen tam sayı veri tipidir.

Smallint: 2 byte büyüklüğünde -32.768 ve 32.768 arası değer alabilen tam sayı veri tipidir.

Tinyint: 1 byte büyüklğüne sahip, 0–255 arası tam sayı veriler için kullanılan tam sayı veri tipidir.

  • Decimal,numeric: İkisinin de kullanımı aynıdır.Bu veri tipinde saklanacak sayının basamak sayısı tanımlanabilir. Veri tipi boyutu belirtilen basamak sayılarına göre değişkenlik gösterebilir.-38 ve +38 basamak arası verileri depolayabilir. -10³⁸ ,10³⁸ arası ondalık ve tam sayı türünde veri saklayabilir.

4) Parasal Veri Tipleri

Money: 8 byte boyutunda, yaklaşı -2⁶⁴ ile 2⁶⁴ arasında parasal değerleri tutmak için kullanılır. 4 basamağa kadar duyarlı ondalık tipli verileri saklar.

Smallmoney: 4 byte uzunluğunda yaklaşık -214.000 ile 214.000 arası parasal değerleri tutmak için kullanılır. Money tipinde olduğu gibi 4 basamağa kadar duyarlı ondalık tipli verileri saklarken kullanılır.

5)Tarih-Zaman Veri Tipleri

Date: Tarihleri YYYY-AA-GG (yıl-ay-gün) formatında saklar. 3 byte uzunluğunda veri tipidir.

Smalldatetime: Tarih ve zaman verilerini yıl-ay-gün ve saat-dakika-saniye-salise şeklide saklar. 4 byte uzunluğunda veri tipidir.

Datetime: YYYY-AA-GG şeklinde tarih ve zaman verilerini tutan 8 byte uzunluğunda veri tipidir. 1 Ocak 1753–31 Aralık 9999 arası veriler için kullanılır.

Datetime2: Datetime’dan farklı olarak 1 Ocak 0001–31 Aralık 9999 tarihleri arası verileri tutan ekstra olarak salise hassasiyeti daha yüksektir. Kapladığı alan salise hassasiyetine göre 6–8 byte arası değişebilir.

Time: Sadece saat verilerini saat-dakika-saniye-salise(7 basamaklı) şeklinde saklayan , boyutu kullanıcı tarafından değiştirilebilen 3–5 byte arası yer kaplayan veri tipidir.

Datetimeoffset: Ülkelere göre değişen zaman farkını hesaplayıp tutarken kullanılır.

6) Diğer Veri Tipleri

Sql_variant: sayı,metin, binary gibi farklı veri tiplerini depolamak için kullanılan veri tipidir. Yani bir sütun ya da fonksiyonda birden fazla veri tipi kullanmamız gerektiğinde tercih etmeliyiz.

  • xml: XML türünde veri saklamak için kullanılır. Kapasitesi 2 GB’dır. Bellekteki boyutu, saklanan XML verisine göre değişkenlik gösterir. Xml veri türü, Extensible Markup Language verilerinin (XML) depolanmasına ve değiştirilmesine izin verir. Xml veri türünün bir karakter veri türüne göre avantajı, xml veri türünün XML node  ve feature’lerinin XQuery ifadeleri kullanılarak bir T-SQL sorgusu içinde bu veri türüne sorgu atılmasına izin vermesidir. Xml veri türü isteğe bağlı olarak bir XML şemasının uygulanmasına da izin verir. Her bir xml veri türü örneği 2 GB’a kadar veri saklayabilir.

Geometry: Öklid koordinat sistemine ait verileri tutmak için kullanılır. Geometrik şekillerin en-boy-yükselik verilerini saklar.

Timestamp: Tabloya kayıt eklendiğinde , güncellendiğinde binary türünde özel değer alan veri tipidir.

  • Uniqueidentifier: 16 byte uzunluğunda benzersiz GUID tipinde veri tutar.İki GUID birbirinden tamamen farklıdır eşit olamazlar. uniqueidentifier veri türü, 16 baytlık boyutunda depolanan genel benzersiz tanımlayıcıların (GUID’ler) oluşturulmasına ve saklanmasına izin verir. uniqueidentifier veri türünde saklanacak değerler, NEWID() sistem fonksiyonu kullanılarak SQL Server’da oluşturulabilir, harici uygulamalar tarafından da üretilebilir veya string değerlerden dönüştürülebilir. Bu iki GUID’lerin aynı olma ihitmali çok düşüktür, ama imkansız değildir.
  • Hierarchyid veri türü, aynı tablodaki satırlar arasındaki hiyerarşik ilişkilerin kaydedilmesini ve sorgulanmasını basitleştirmek için kullanılır. Örneğin, bir kuruluş şemasında bulunan düzeyler veya malzeme listesi. SQL Server, hierarchyid bir binary veri türünü değişken uzunlukta depolar; hiyerarşi değerinin gösterimi built-in fonksiyonlarla sağlanır.
  • Rowversion veri türü, otomatik olarak oluşturulan 8 baytlık bir binary değeri, her satır eklendiğinde veya güncellendiğinde artan bir tabloda depolar. Rowversion veri değerlerinde tarih veya saat bilgileri depolanmaz, fakat bir satırın client tarafından en son okunduğundan bu yana değişip değişmediğini tespit etmek için kullanılabilir (örneğin optimistic locking uygularken).
  • Geometry veri türü, verileri Öklid (float) koordinat sisteminde depolamak için kullanılır. Çizgileri, çokgenleri ve diğer basit geometrik şekilleri tanımlayan koordinat dizileri geometry veri tipinde saklanabilir. Geometri verileri üzerinde işlem yapmak için özel built-in fonksiyonlar bulunmaktadır.
  • Geography veri türü, verileri GPS enlemi ve koordinatlı boylam gibi bir yuvarlak toprak koordinat sisteminde depolamak için kullanılır. Geography veri türünde olduğu gibi, şekil tanımları geography türünde saklanabilir ve bu veriler üzerinde işlem yapmak için özel built-in fonksiyonlar bulunmaktadır .
  • Sql_variant türü, örneğin tamsayı, ondalık ve karakter verilerinin aynı sütunda depolanmasını sağlayan diğer yerleşik veri türlerinin verilerini depolamak için kullanılabilen özel bir türdür. sql variant kullanımı tipik veri tabanı tasarımları için en iyi uygulama değildir ve kullanımı tasarım sorunlarına yol açabilir. sql variant veri türü konu bütünlüğü sağlamak için burada listelenmiştir.

Aşağıdaki veri türleri tablolarda veya view’lardaki sütunlarında kullanılamaz; stored procedure’ler içerisinde değişken veya parametre olarak kullanılırlar:

  • Cursor veri türü, bir veri kümesinin satır satır işlenmesini sağlayan bir veri türüdür. Ayrıntısı bu bölümün kapsamı dışındadır.
  • Table veri türü, standart veri tabanı tablosunun özelliklerinin çoğuna sahip olan, ancak yalnızca oluşturulduğu oturum bağlamında var olan bir tablo değişkeni veya bir stored procedure parametresi tanımlamak için kullanılır. table veri türleri, daha sonra işlenmek üzere T-SQL ifadelerinin sonuçlarını geçici olarak depolamak için kullanılır. Bu yazı serisinin ilerleyen bölümlerinde table veri türünün kullanımları hakkında bilgi edineceksiniz.

Veri Türü Önceliği

Sorgularınızdaki farklı veri türlerini birleştirirken veya karşılaştırırken (örneğin Where veya Join içerisinde), SQL Server’ın bir değerin veri türünü diğer değerin veri türüne dönüştürmesi gerekir. Hangi veri türünün dönüştürüleceği, ikisi arasındaki önceliğe bağlıdır.

SQL Server’da, tüm veri türlerinin sıralaması önceliğe göredir. Herhangi iki veri türü kendi aralarında biri düşük önceliğe, diğeri yüksek önceliğe sahip olacaktır. Dönüştürme sırasında SQL Server, daha düşük veri türünü daha yüksek olan veri türüne dönüştürmeye çalışır. Tipik olarak bu işlem özel koda ihtiyaç duyulmadan örtülü (implicit) olarak gerçekleşir. Ancak bu veri tipi öncelik düzenini temel olarak anlamanız önemlidir, böylece veri türlerini birleştirmek veya dönüştürmek için ne zaman manuel olarak (explicit) dönüştürmeniz gerektiğini anlarsınız.

 

Size ve Veritabanlarınıza Yardımcı Olmak İçin Bekliyoruz!